我是用JSON.parse后数组名一样的对象只保留最后最后一个?

问题更新

现在的字符串内容

'{
  "black_list": [],
  "punc": [],
  "leader": [],
  "org": [],
  "pol": [],
  "grammar_pc": [],
  "order": [],
  "idm": [],
  "word": [],
  "char": [],
  "redund": [],
  "miss": [],
  "dapei": [],
  "number": [],
  "addr": [],
  "name": [],
  "yjtimeintegrity": [[-1,"","2023年03月16日16时","发布时间不完整,没有包含"月"、"日"、"时"。"]],
  "yjaddr": [[-1,"","","未包含正确的行政区域名称。"]],
  "yjtemperature": [[63,"97","","温度数据异常。"],[59,"93","","温度数据异常。"]],
  "yjillegal": [[75,"测试","","内容包含非法关键词。"]]
}'

我用以下三种方式转换都报错

JSON.parse(str); // 第一种
eval("(" + str + ")"); // 第二种
(new Function("return " + str))(); // 第三种

image.png


原问题

'{
  "black_list": [],
  "punc": [],
  "leader": [],
  "org": [],
  "pol": [],
  "grammar_pc": [],
  "order": [],
  "idm": [],
  "word": [],
  "char": [],
  "redund": [],
  "miss": [],
  "dapei": [],
  "number": [],
  "addr": [],
  "name": [],
  "yjdatetime": [[10,"20230316","2023年03月15日","发布时间与当前时间不一致"]],
  "yjaddr": [[-1,"","","未包含正确的行政区域名称。"]],
  "yjtemperature": [[63,"97","","温度数据异常。"]],
  "yjtemperature": [[59,"93","","温度数据异常。"]]
}'

展示出来的只有最后 yjtemperature 内容 前一个被覆盖过滤了
可以将键名一致的项合并吗?

阅读 1.3k
3 个回答

因为这个JSON数据是一个JSON对象,并不是集合,所以使用 JSON.parse 转换成JS对象同样是的属性值会被覆盖掉。
正常应该把两条重复的数据放到一起,比如说这样:

'{
  "black_list": [],
  "punc": [],
  "leader": [],
  "org": [],
  "pol": [],
  "grammar_pc": [],
  "order": [],
  "idm": [],
  "word": [],
  "char": [],
  "redund": [],
  "miss": [],
  "dapei": [],
  "number": [],
  "addr": [],
  "name": [],
  "yjdatetime": [[10,"20230316","2023年03月15日","发布时间与当前时间不一致"]],
  "yjaddr": [[-1,"","","未包含正确的行政区域名称。"]],
-  "yjtemperature": [[63,"97","","温度数据异常。"]],
-  "yjtemperature": [[59,"93","","温度数据异常。"]]
+  "yjtemperature": [[63,"97","","温度数据异常。"],[59,"93","","温度数据异常。"]]
}'

所以产出JSON数据的时候就提前处理好就是了。为什么要在接收端处理这个问题,造成不必要的麻烦。

做确实可以做,但是没必要做。


我把你的JSON数据格式化了一下,其实你马上就可以看到问题了。你的JSON字符串内的某一部分没有转义内部的引号("),所以导致了JSON解析的失败。

还是需要后端处理的时候做转义或者转换成其他引号('“”) 来表示,例如说以下这样:

- "yjtimeintegrity": [[-1,"","2023年03月16日16时","发布时间不完整,没有包含"月"、"日"、"时"。"]]
+ "yjtimeintegrity": [[-1,"","2023年03月16日16时","发布时间不完整,没有包含“月”、“日”、“时”。"]]

本文参与了SegmentFault 思否面试闯关挑战赛,欢迎正在阅读的你也加入。
  1. 标准 JSON 库肯定不行
  2. 你可以自己写解析函数,不过工作量比较大
  3. 建议从根源入手,在生成字符串的阶段解决这个问题
推荐问题
宣传栏