Javascript 使用转义引号分析JSON时出错

Javascript 使用转义引号分析JSON时出错,javascript,json,Javascript,Json,当我从浏览器调用URL时,我得到了以下json对象,我希望其中没有数据 "{\"data\":[], \"SkipToken\":\"\", \"top\":\"\"}" 然而,当我试图在javascript中调用它时,解析Json消息时会出现错误 dspservice.callService(URL, "GET", "", function (data) { var dataList = JSON.parse(data); )}; 在我不知道为什么突然停止工作并向我抛出错误之前,这

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

"{\"data\":[], \"SkipToken\":\"\", \"top\":\"\"}"
然而,当我试图在javascript中调用它时,解析Json消息时会出现
错误

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

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

既然您给我们的JSON字符串没有问题,唯一的另一种解释是传递给函数的
数据与您列出的内容不同

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

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
的格式似乎不正确,那么您就有了问题的答案


将断点放在
处理程序
函数的第一行,其中定义了
goodData
。然后逐步完成代码。根据您在评论中告诉我的,它在JSON解析过程中仍然会崩溃,但我敢打赌,它在第二次解析中失败,而不是第一次。

您的JSON是这样的吗

"{\"data\":[], \"SkipToken\":\"\", \"top\":\"\"}"
然后回调中的
data
将如下所示:

'"{\"data\":[], \"SkipToken\":\"\", \"top\":\"\"}"'
因为
data
是获取的文本内容字符串

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

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

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

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

正确的JSON应该是:

{"data":[], "SkipToken":"", "top":""}
如果您的服务器返回这个,它将正确解析

这里的混乱,以及其他海报的报告,似乎您的字符串应该工作,在于在一个简单的测试中,我在控制台中键入这个字符串:

var x = "{\"data\":[], \"SkipToken\":\"\", \"top\":\"\"}";
JavaScript字符串文字转义机制与JSON中转义的使用完全不同,它产生一个值为

{"data":[], "SkipToken":"", "top":""}
当然,JSON.parse可以很好地处理这个问题。但是Javascript字符串转义适用于源代码中的字符串文本,而不是来自服务器的内容

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

另一种方法是自己撤销转义,然后将其交给
JSON.parse
。第一个切入点是一个简单的regexp,例如

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

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


我无法解释为什么这个正在工作的代码突然停止工作。我最好的猜测是服务器端发生了变化,开始转义双引号。

如果他不转义双引号,那么他的代码甚至不会运行。@StuartWagner JSON.parse处理转义引号刚刚好在浏览器开发工具网络选项卡中检查实际响应…可以通过jsonlint.com运行它,但我怀疑它不是jsonI删除的我的回答,因为它是无效的,但是,如果你想进一步说明什么是错误的,那么这里有一个问题,因为这个问题表明你的JSON是好的:你能在回调中添加一个
控制台.log
,看看
数据
输出什么吗?他在OP中粘贴的JSON没有问题。@TimBiegeleisen实际上,有
JSON.parse
将立即被初始花括号后面的反斜杠卡住。在JSON中,唯一可以跟在开头的花括号后面的是属性名开头的双引号。所以,实际上这个答案是正确的,虽然它可能更清楚一些,而不是“你不必添加”,它可能是“服务器不能添加”。它没有被JS搞得喘不过气来。那么你是如何得到JSON解析错误的呢?你至少应该能够得到
JSON.parse()
调用示例代码的第三行。您使用的是Chrome还是Firefox?@ilyasUyanik请像我在上面的回答中所做的那样提取处理函数。这将允许您在代码中放置一个适当的断点。要使用与他所说的从服务器返回的内容相匹配的字符串文字进行有效测试,您必须将其编写为
var goodData=“{\\\”data\\”:[],\\\“SkipToken\\”:\\\\“,\\\\“top\\\”:\\\\\\\\“\\\”
data.replace(/\\"/g, '"')
var dataList = JSON.parse(data.replace(/\\"/g, '"')