使用转义引号解析JSON时出错

时间:2015-05-08 01:39:59

标签: javascript json

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

"{\"data\":[], \"SkipToken\":\"\", \"top\":\"\"}"

然而,当我尝试在javascript中调用它时,它会给我error Parsing Json message

dspservice.callService(URL, "GET", "", function (data) {
    var dataList = JSON.parse(data);
)};

此代码在我不知道为什么突然停止工作并向我发生错误之前就已经开始工作了。

3 个答案:

答案 0 :(得分:1)

由于您给我们的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)
}

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

handler函数的第一行放置一个断点,其中定义了goodData。然后单步执行代码。根据你在评论中告诉我的内容,它在JSON解析期间仍然崩溃,但我愿意下注第二个解析而不是第一个

答案 1 :(得分:1)

你说服务器正在返回JSON(省略括号):

{\"data\":[], \"SkipToken\":\"\", \"top\":\"\"}

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

正确的JSON将是:

{"data":[], "SkipToken":"", "top":""}

如果你的服务器返回了它,它将正确解析。

这里的混乱,以及其他海报的报告,看起来你的字符串应该有效,这是因为在一个简单的测试中,我将这个字符串输入控制台:

var x = "{\"data\":[], \"SkipToken\":\"\", \"top\":\"\"}";

JavaScript字符串文字转义机制,它完全不同于在JSON中使用转义,导致字符串的值为

{"data":[], "SkipToken":"", "top":""}

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

要修复服务器错误转义的JSON,您有两种可能性。一个是告诉服务器人他们不需要(并且一定不要)在引号之前加上反斜杠(除了引号字符串内)。一切都会奏效。

另一种方法是在将其交给JSON.parse之前撤消自己逃脱。第一次切割是一个简单的正则表达式,如

data.replace(/\\"/g, '"')

,如

var dataList = JSON.parse(data.replace(/\\"/g, '"')

可能需要额外调整,具体取决于服务器人员如何在字符串中转义引号;他们发送的是\"\\"\",还是\"\\\"\"

我无法解释为什么这个正在运行的代码突然停止工作。我最好的猜测是服务器端的变化,它开始逃避双引号。

答案 2 :(得分:0)

你的意思是你的JSON是这样的吗?

"{\"data\":[], \"SkipToken\":\"\", \"top\":\"\"}"

然后回调中的data就像这样:

'"{\"data\":[], \"SkipToken\":\"\", \"top\":\"\"}"'

因为data是获取的文本内容字符串。

您不必在JSON中添加额外的引号:

{"data":[], "SkipToken":"", "top":""}