当我从浏览器调用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)
它可能需要额外的调整,具体取决于服务器人员如何转义字符串内的引号;他们正在发送\"\\"\",或者可能发送\"\\\"\"吗?
我无法解释为什么这段正在运行的代码突然停止运行。我最好的猜测是服务器端的更改开始转义双引号。
由于您提供给我们的 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 解析期间仍然崩溃,但我愿意打赌它在第二次解析时失败,而不是第一次。