为了账号安全,请及时绑定邮箱和手机立即绑定

为什么 JSON.parse() 会删除字符串中存在的一些属性?

为什么 JSON.parse() 会删除字符串中存在的一些属性?

汪汪一只猫 2023-09-28 09:48:09
我注意到在我的客户端代码中,我的服务响应缺少一些(但不是全部)属性。当我查看 Chrome 中的开发工具“网络”选项卡时,我发现服务响应似乎包含这些缺失的属性,但从 Angular http 客户端返回的对象却没有。因此,出于调试目的,我尝试配置我的 http 客户端请求选项,将响应正文解释为文本并返回字符串并记录它。然后我做了一个 JSON.parse(responseText) 。记录的responseText具有我期望的全套属性,但JSON.parse失败并出现意外的令牌异常。因此,在发现一些转义反斜杠似乎导致解析问题后,我尝试在响应和解析之间注入 JSON.stringify 。我还记录了字符串化响应,它仍然显示了全套预期属性。添加 stringify 后 JSON.parse 也通过了。但是,JSON.parse 导致原来丢失的属性被删除。在这种情况下我没有收到解析错误。只是缺少一些属性。源字符串中第一个缺失的属性是一个名为 id 的简单属性,其中包含 UUID 字符串值。它后面的三个属性也丢失了。{"a": "A","b": "B","c": "C", "id": "726abb0e-6cc6-4496-94a2-906439c06a30","1": 12345,"2": "stringVal","3": "stringValue"}解析这个字符串的结果是{"a": "A","b": "B","c": "C"}完整的 JSON 要复杂得多,我在这里包含的是一个包含多个此类类型的数组中的单个实例。数组中的所有实例都缺少相同的属性。因此它不会停止解析完整的 json,并且仍然解析数组中的其他实例。
查看完整描述

3 回答

?
芜湖不芜

TA贡献1796条经验 获得超7个赞

事实证明,我的问题的真正答案是解析并没有排除某些属性。相反,我被 Chrome 中的控制台语句误导了。我的经历是,控制台日志仅评估在日志中展开时记录的对象的状态。我假设它代表写入日志条目时的状态。发生的情况是,稍后在代码中修改引用,并且当我在其他代码对对象进行更改后读取它时,控制台反映了更改后的对象引用。感谢所有阅读本文并提供任何建议的人,但我担心我自己对其工作原理的误解才是问题的真正原因。



查看完整回答
反对 回复 2023-09-28
?
翻过高山走不出你

TA贡献1875条经验 获得超3个赞

原因是 JSON.parse 对于特殊字符无法正常工作。解决方案如下:


function escapeUnicode(str) {

    return str.replace(/[^\0-~]/g, function(ch) {

        return "\\u" + ("0000" + ch.charCodeAt().toString(16)).slice(-4);

    });

}


查看完整回答
反对 回复 2023-09-28
?
慕尼黑5688855

TA贡献1848条经验 获得超2个赞

我不确定为什么您只得到部分返回,但您的 JSON 字符串看起来无效。您需要在、和属性:后添加冒号。以下内容应该正确解析。"a""b""c"


{

"a": "A",

"b": "B",

"c": "C", 

"id": "726abb0e-6cc6-4496-94a2-906439c06a30",

"1": 12345,

"2": "stringVal",

"3": "stringValue"

}


查看完整回答
反对 回复 2023-09-28
  • 3 回答
  • 0 关注
  • 76 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信