我有一个 javascript 对象,它包含一个属性,该属性具有另一个 json 字符串化对象的值。我无法将字符串的打印输出版本恢复为对象形式。请参见以下代码。 json
字符串的console.log
输出内容与jsonFromStr
右侧完全一致。但是,JSON.parse(json)
是正常的,而 JSON.parse(jsonFromStr)
是错误的。这里有什么问题?
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
最佳答案
如果你这样做,它将起作用:
jsonFromStr = '{"key1a":"bar","key1b":{"level2ObjJson":"{\\\"key2a\\\":\\\"foo\\\",\\\"key2b\\\":3}"}}';
您的版本不起作用的原因是转义序列 \"
在那一刻被解析,因此 jsonFromStr
的实际值将是:
'{"key1a":"bar","key1b":{"level2ObjJson":"{"key2a":"foo","key2b":3}"}}'
...这是无效的 JSON。
您需要在 JSON 字符串中保持未解析的转义,为此您可以通过使用额外的斜杠转义转义序列本身来实现这一点。
关于多层次的 Javascript JSON 解析和字符串化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36815031/