我注意到在我的客户端代码中,我的服务响应缺少一些(但不是全部)属性。当我查看 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 中的控制台语句误导了。我的经历是,控制台日志仅评估在日志中展开时记录的对象的状态。我假设它代表写入日志条目时的状态。发生的情况是,稍后在代码中修改引用,并且当我在其他代码对对象进行更改后读取它时,控制台反映了更改后的对象引用。感谢所有阅读本文并提供任何建议的人,但我担心我自己对其工作原理的误解才是问题的真正原因。
翻过高山走不出你
TA贡献1875条经验 获得超3个赞
原因是 JSON.parse 对于特殊字符无法正常工作。解决方案如下:
function escapeUnicode(str) {
return str.replace(/[^\0-~]/g, function(ch) {
return "\\u" + ("0000" + ch.charCodeAt().toString(16)).slice(-4);
});
}
慕尼黑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"
}
添加回答
举报
0/150
提交
取消