首页 > 解决方案 > 为什么 json.parse 会中断?以及如何解决它

问题描述

我有以下数据从我的服务器进入我的 js 代码,从我的服务器。

{"triggers": [{"message_type": "sms","recipients": "[\"+91xxxxxxxxx\",\"+91xxxxxxxxx\"]","message": "This is a test"}]}

我的代码以下列方式解析上述 json 字符串。

data = '{"triggers": [{"message_type": "sms","recipients": "[\"+91xxxxxxxx\",\"+91xxxxxxxx\"]","message": "This is a test"}]}'
parsed = JSON.parse(data);

这会引发以下异常

Uncaught SyntaxError: Unexpected token + in JSON at position 54
    at JSON.parse (<anonymous>)
    at eval (eval at <anonymous> (entry.html:2), <anonymous>:1:6)
    at entry.html:298

我做了一点进一步的挖掘,找到了 json 字符串的来源。这是我的python代码中字符串的来源

data = {"recipients": "[\"+91xxxxxxxxx\",\"+91xxxxxxxx\"]"} # This data comes in from my database, and I can't do anything about what quotes are used.
javascript_supplied_data = json.dumps(data) #This data goes to the frontend via webhook

我尝试通过这个在线查看器将相同的数据放入 json 视图中,它没有抛出任何错误并正确显示了数据。

我无法理解的是,我在我的 python 代码中做了一个 json.dumps,所以字符串响应应该是 json 可解析的。那么为什么 JSON.parse 会抛出这个错误呢?

python端或javascript端的json库有什么问题,还是我太菜鸟了?

请帮我弄清楚是什么导致了这个问题,以及如何解决它。

注意:我无法控制来自服务器的字符串。

标签: javascriptpython

解决方案


当您拥有有效的 JSON,但将其放在字符串文字中时,JavaScript 中文字符号处理的转义会使字符串不同。反斜杠被解释为转义下一个字符。

所以要么你必须通过字符串文字并将所有反斜杠加倍,或者你可以将String.raw字符串文字作为模板字符串应用:

var data = String.raw`{"triggers": [{"message_type": "sms","recipients": "[\"+91xxxxxxxx\",\"+91xxxxxxxx\"]","message": "This is a test"}]}`;
var parsed = JSON.parse(data);
console.log(parsed);

但是请注意,您在问题开始时发布的 JSON 是有效的。

另一方面,您得到的错误表明第\"一个之前的错误+被解释为 just "。这意味着\当从服务器接收到字符串时实际上并不存在。这通常是由服务器端类似的转义问题引起的,程序员打算将反斜杠发送给客户端,但实际上只是"在服务器上转义了,导致只"发送给客户端而不是发送给客户端\"


推荐阅读