2016-04-23 9 views
1

私は別のjson文字列化オブジェクトの値を持つプロパティを含むjavascriptオブジェクトを持っています。文字列の出力版をオブジェクト形式に戻すことができません。次のコードを参照してください。 json文字列のconsole.log出力内容は、jsonFromStrとまったく同じです。ただし、JSON.parse(json)はOKですが、JSON.parse(jsonFromStr)はエラーです。ここで何が間違っていますか?Javascript JSONは多レベルの解析と文字列化

jsfiddle:http://jsfiddle.net/jma7889/qtmmpj2t/

level2Obj = { key2a: "foo", key2b: 3}; 
level2ObjJson = JSON.stringify(level2Obj); 
level1Obj = {key1a: "bar", key1b: {level2ObjJson}}; 

json = JSON.stringify(level1Obj); 
jsonFromStr = '{"key1a":"bar","key1b":{"level2ObjJson":"{\"key2a\":\"foo\",\"key2b\":3}"}}'; // same than json 

objFromStrify = JSON.parse(json); // OK 
objFromAssignedString = JSON.parse(jsonFromStr); // Uncaught SyntaxError: Unexpected token l in JSON at position 45 

答えて

2

あなたがこれを行う場合、それは動作します:

jsonFromStr = '{"key1a":"bar","key1b":{"level2ObjJson":"{\\\"key2a\\\":\\\"foo\\\",\\\"key2b\\\":3}"}}'; 

をお使いのバージョンでは動作しないという理由は、エスケープシーケンス\"がその瞬間に解決されることで、そのためjsonFromStrの実際の値は次のようになります。

'{"key1a":"bar","key1b":{"level2ObjJson":"{"key2a":"foo","key2b":3}"}}' 

...無効なJSONです。

これらのエスケープをJSON文字列に残さないようにする必要があります。これは、エスケープシーケンス自体をスラッシュでエスケープすることによって行います。

+0

これは、この方法で動作します、ありがとう! –

+0

ようこそ。 – trincot

0
jsonFromStr = '{"key1a":"bar","key1b":{"level2ObjJson":{\"key2a\":\"foo\",\"key2b\":3}}}'; 

あなたはlevel2ObjJsonキーの値のため、上記のコードで、コード内でjsonFromStrを置き換える "" 余分を持っています。