2017-01-31 5 views
0

複雑なJavaScriptオブジェクトをJSONに変換したい(データをファイルに保存する前など)。これらのオブジェクトには、ES6/ES2015のマップやセットなど、任意のタイプの任意のネストされたデータ値が含まれている場合があります。例えばネストしたES2015のマップとセットをJSONに含めることはできますか?

const myOriginalObject = { 
    a: [1, new Set([2, new Map()]), 3], 
    c: {d: new Map([['e', 4], ['f', new Set()]])} 
}; 

ただし、は、マップ/セットデータを失います。では、JSONとして保存すると、マップやセットにデータを保持する方法はありますか?

答えて

0

あなたはJSON.stringifyとマップおよび/またはセット標準のJavaScriptの配列にして再度変換しJSON.parseと対応reviver機能をreplacer機能を使用することができます。例えば

代替とリバイバー機能マップから誘導されたものとして

const replacer = (k, v) => 
    v instanceof Map ? ({_WAS_MAP: [...v]}) : 
    v instanceof Set ? ({_WAS_SET: [...v]}) : v; 

const reviver = (k, v) => 
    v && v._WAS_MAP ? new Map(v._WAS_MAP) : 
    v && v._WAS_SET ? new Set(v._WAS_SET) : v; 

この技術は、例えば、新しい配列を、例えば、JSON.stringifya map-to-array conversion strategyを使用し、同時に「マーク」 Map { 'a' => 1 }{"_WAS_MAP":[["a",1]]}に変換します。その後、JSON.parse_WAS_MAPというラベルの付いたプロパティを検索し、それらをマップに変換することができます。同様の戦略がセットでも有効です。

例コード:

const myOriginalObject = { 
    a: [1, new Set([2, new Map()]), 3], 
    c: {d: new Map([['e', 4], ['f', new Set()]])} 
}; 

console.log('original:', myOriginalObject); 
const mySavedJson = JSON.stringify(myOriginalObject, replacer); 
console.log('JSON:', mySavedJson); 
const myRetrievedObject = JSON.parse(mySavedJson, reviver); 
console.log('retrieved:', myRetrievedObject); // all data is recovered 

出力(空白を明確にするために編集):一方、ため

original: { a :[1,  Set {2,  Map {} },3], c :{ d:  Map { 'e' => 4, 'f' =>  Set {} }}} 
JSON:  {"a":[1,{"_WAS_SET":[2,{"_WAS_MAP":[]}]},3],"c":{"d":{"_WAS_MAP":[["e", 4],["f",{"_WAS_SET":[]}]]}}} 
retrieved: { a :[1,  Set {2,  Map {} },3], c :{ d:  Map { 'e' => 4, 'f' =>  Set {} }}} 

(I、作業コードスニペットに上記のコードを含んでいませんconsole.logは、ノードの実行時に上記のように地図やデータを表示します(ノードなど)。StackOverflowのコードスニペットで実行すると表示されません。

関連する問題