【问题标题】:Construct nested escaped JSON string for JSON.parse() recursive retreival为 JSON.parse() 递归检索构造嵌套的转义 JSON 字符串
【发布时间】: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 - 是的,来自服务器端的错误代码,需要数月甚至数年才能到达团队并让他们相信这个错误。不可能:(

标签: javascript jquery json parsing recursion


【解决方案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);

【讨论】:

  • 感谢您的回答,但是是不是硬编码太多了?我正在寻找一个通用的解决方案。
猜你喜欢
  • 2019-03-31
  • 1970-01-01
  • 1970-01-01
  • 2016-03-02
  • 2019-08-30
  • 2020-02-16
  • 2020-06-11
  • 1970-01-01
  • 2019-12-27
相关资源
最近更新 更多