为 JSON.parse() 递归检索构造嵌套的转义 JSON 字符串

Posted

技术标签:

【中文标题】为 JSON.parse() 递归检索构造嵌套的转义 JSON 字符串【英文标题】:Construct nested escaped JSON string for JSON.parse() recursive retreival 【发布时间】:2020-02-12 05:34:10 【问题描述】:

服务器返回一个 JSON 字符串,如下所示:

"payload":"data":"\"notification_type\":\"\"type1\":\"\"type2\":\"type2 value\"\"\""

据我所知,这个字符串不能用 JSON.parse() API 解析,因为字符串中嵌套的 JSON 字符串应该被正确转义。如果字符串没有正确转义,我会收到以下错误:

Uncaught SyntaxError: Unexpected token n in JSON at position 22

因此,字符串应该按照嵌套性质正确转义,如下所示,以便 JSON.parse() 可以处理它:

var properString = "\"payload\":\"data\":\"\\\"notification_type\\\":\\\"\\\\\\\"InternalKey\\\\\\\":\\\\\\\"InternalValue\\\\\\\"\\\"\"";
console.log("Proper String = ");
console.log(properString);
var firstLevelObject = JSON.parse(properString);
console.log("First Level Object = ");
console.log(firstLevelObject);
var secondLevelObject = JSON.parse (firstLevelObject.payload.data);
console.log("Second Level Object = ");
console.log(secondLevelObject);
var thirdLevelObject = JSON.parse(secondLevelObject.notification_type);
console.log("Third Level Object = ");
console.log(thirdLevelObject);

这是 google chrome 的控制台输出相同的方式:

但是,我无法将不正确的字符串从服务器转换为变量properString 中定义的正确转义字符串,以便正确构造可以遍历的 JSON。如何使用正确的转义字符转换字符串?

参考来源: 我已经参考了this 的答案来了解应该如何添加嵌套转义字符,但答案并没有说明如何进行转换。

【问题讨论】:

第一个问题:你能拒绝维护服务器代码的人吗?理想情况下,您永远不会收到这样的数据! (我知道,我知道!) @ScottSauyet - 是的,来自服务器端的错误代码,需要数月甚至数年才能到达团队并让他们相信这个错误。不可能:( 【参考方案1】:

实际上,你得到的 JSON 字符串并不完全正确。这不是嵌套 JSON 字符串中的正确 JSON 语法。但是你可以通过正则表达式或原生 JS 将其重建为正确的 JSON 语法字符串。

var obj = '"payload":"data":"\"notification_type\":\"\"type1\":\"\"type2\":\"type2 value\"\"\""';
var payloadString = obj.substring(0, 20).concat('"');
obj = obj.substring(20, obj.length - 3).replace("\"", "").replace("\"", "").replace("\"", "").replace("\"", "");

var data = JSON.parse(obj);
var obj2 = JSON.parse(payloadString);

//console.log(payload);
//console.log(data);
obj2.payload.data = data;
console.log(obj2);

【讨论】:

感谢您的回答,但是是不是硬编码太多了?我正在寻找一个通用的解决方案。

以上是关于为 JSON.parse() 递归检索构造嵌套的转义 JSON 字符串的主要内容,如果未能解决你的问题,请参考以下文章

JSON.parse 应该是递归的吗?

如何构造我的对象以检索嵌套的 FireBase 数据

原生js实现JSON.parse()和JSON.stringify()

JSON对象及方法

JSON.parse() 的实现

javascript学习之js对象和json对象(obj=JSON.parse(stu))