2015-11-26 37 views
1

用下面的代码我使用节点5.1和6.1.2打字稿如何解析映射在node.js中

文件我试图解析了在app.js错误ecma6(打字稿)到JSON是Firefox的bookmark.json。 我的目标是将其解析为一张地图,并将其解析为json。

'use strict'; 
    declare function require(name:string); 
    let fs = require('fs'); 

    fs.readFile('./bookmarks.json', 'utf8', handleFile); 

    function handleFile(err, data) { 

     function strMapToObj(strMap) { 
      let obj = Object.create(null); 
      for (let [k,v] of strMap) { 
       obj[k] = v; 
      } 
      return obj; 
     } 
     function strMapToJson(strMap) { 
      return JSON.stringify(strMapToObj(strMap)); 
     } 

     function objToStrMap(obj) { 
      let strMap = new Map(); 
      for (let k of Object.keys(obj)) { 
       strMap.set(k, obj[k]); 
      } 
      return strMap; 
     }  
     function jsonToStrMap(jsonStr) { 
      return objToStrMap(JSON.parse(jsonStr)); 
     } 

     if(err) throw err; 

     let myMap = jsonToStrMap(JSON.parse(JSON.stringify(data))); 
     console.log(myMap); // works well 
     let result = strMapToJson(myMap); 
     console.log(result); // returns an error  
    } 

我得到了一个语法错误有一个意外标记为 (就让[K,V] strMap)

如何解决呢?

如何将这样的地图从firefox bookmarks.json解析回json?

+0

有什么特别的原因不只是使用'JSON.parse(数据)'和'JSON.stringify(数据图) '? –

+0

@ macareno.marco:除了[那不起作用](http://stackoverflow.com/a/28918362/1048572),OP受到文件模式的限制 – Bergi

回答

1

好吧,这里是我的解决方案: 我使用json8库从https://github.com/JSON8/JSON8

'use strict'; 

declare function require(name:string); 
let fs = require('fs'); 
let oo = require('json8'); 


fs.readFile('./bookmarks.json', 'utf8', handleFile); 

function handleFile(err, data) { 

    function mapToJson(map) { 
     return oo.serialize(map); 
    } 

    function objToStrMap(obj) { 
     let strMap = new Map(); 
     for (let k of Object.keys(obj)) { 
      strMap.set(k, obj[k]); 
     } 
     return strMap; 
    } 


    function jsonToStrMap(jsonStr) { 
     return objToStrMap(JSON.parse(jsonStr)); 
    } 


    if(err) throw err; 

    let myMap = jsonToStrMap(JSON.parse(JSON.stringify(data))); 
    //console.log(myMap); 

    let result = mapToJson(myMap); 
    console.log(result); // gives the correct object back 

}