为什么json.parse会中断?以及如何解决

Nit*_*tro 0 javascript python

我有以下数据从服务器输入到服务器的js代码中。

{"triggers": [{"message_type": "sms","recipients": "[\"+91xxxxxxxxx\",\"+91xxxxxxxxx\"]","message": "This is a test"}]}
Run Code Online (Sandbox Code Playgroud)

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

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

这引发以下异常

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
Run Code Online (Sandbox Code Playgroud)

我做了一些进一步的挖掘,发现了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
Run Code Online (Sandbox Code Playgroud)

我尝试通过在线查看器将相同数据放入json视图中,但没有引发任何错误并正确显示了数据。

我不明白的是,我在python代码中执行了json.dumps,因此字符串响应应该是json可解析的。那么,为什么JSON.parse会引发此错误?

python端或javascript端的json库是否出了问题,还是我的菜鸟太多了?

请帮助我找出导致此问题的原因以及解决方法。

注意:我对来自服务器的字符串没有任何控制。

tri*_*cot 5

当您具有有效的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);
Run Code Online (Sandbox Code Playgroud)

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

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