解析带有转义引号的JSON时出错

cas*_*las 6 javascript json

当我从浏览器调用URL时,我得到以下json对象,我希望其中没有数据。

"{\"data\":[], \"SkipToken\":\"\", \"top\":\"\"}"
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试用javascript调用它时,它给了我 error Parsing Json message

dspservice.callService(URL, "GET", "", function (data) {
    var dataList = JSON.parse(data);
)};
Run Code Online (Sandbox Code Playgroud)

在我不知道为什么突然停止工作并抛出错误之前,这段代码一直在工作。

小智 5

您说服务器正在返回 JSON(省略引号):

{\"data\":[], \"SkipToken\":\"\", \"top\":\"\"}
Run Code Online (Sandbox Code Playgroud)

这是无效的 JSON。JSON 中围绕字符串和属性名称的引号前面不应反斜杠。JSON 中的反斜杠严格用于在字符串内插入双引号。(它也可以用于转义字符串中的其他字符,但这与这里无关。)

正确的 JSON 是:

{"data":[], "SkipToken":"", "top":""}
Run Code Online (Sandbox Code Playgroud)

如果您的服务器返回此内容,它将正确解析。

这里的混乱以及其他发帖者的报告认为您的字符串应该可以工作,其原因在于在一个简单的测试中,我在控制台中输入了这个字符串:

var x = "{\"data\":[], \"SkipToken\":\"\", \"top\":\"\"}";
Run Code Online (Sandbox Code Playgroud)

JavaScript字符串文字转义机制与 JSON 中转义的使用完全不同,会产生一个具有以下值的字符串

{"data":[], "SkipToken":"", "top":""}
Run Code Online (Sandbox Code Playgroud)

当然 JSON.parse 可以很好地处理。但是 Javascript 字符串转义适用于源代码中的字符串文字,而不是来自服务器的内容。

要修复服务器错误转义的 JSON,您有两种可能性。一是告诉服务器人员他们不需要(也不能)在引号前添加反斜杠(字符串内的引号除外)。然后一切都会正常。

另一种方法是在将其交给 之前先撤消自己的转义JSON.parse。首先是一个简单的正则表达式,例如

data.replace(/\\"/g, '"')
Run Code Online (Sandbox Code Playgroud)

var dataList = JSON.parse(data.replace(/\\"/g, '"')
Run Code Online (Sandbox Code Playgroud)

它可能需要额外的调整,具体取决于服务器人员如何转义字符串内的引号;他们正在发送\"\\"\",或者可能发送\"\\\"\"吗?

我无法解释为什么这段正在运行的代码突然停止运行。我最好的猜测是服务器端的更改开始转义双引号。


Tim*_*sen 2

由于您提供给我们的 JSON 字符串没有任何问题,唯一的其他解释是data传递给您的函数的内容与您列出的内容不同

要测试这个假设,请运行以下代码:

dspservice.callService(URL, "GET", "", handler(data));

function handler(data) {
    var goodData = "{\"data\":[], \"SkipToken\":\"\", \"top\":\"\"}";
    alert(goodData);                         // display the correct JSON string
    var goodDataList = JSON.parse(goodData); // parse good string (should work)
    alert(data);                             // display string in question
    var dataList = JSON.parse(data);         // try to parse it (should fail)
}
Run Code Online (Sandbox Code Playgroud)

如果goodData可以毫无问题地解析 JSON 字符串,并且data格式似乎不正确,那么您就得到了问题的答案。

handler在函数的第一行定义断点goodData。然后逐步执行代码。根据您在评论中告诉我的内容,它在 JSON 解析期间仍然崩溃,但我愿意打赌它在第二次解析时失败,而不是第一次。