javascript - 为什么 json.parse 会中断?以及如何修复它

标签 javascript python

我有以下数据从我的服务器传入我的 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

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

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

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

请帮我找出导致此问题的原因以及如何解决它。

注意:我无法控制从服务器传入的字符串。

最佳答案

当您有有效的 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 是有效的。

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

关于javascript - 为什么 json.parse 会中断?以及如何修复它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56231377/

相关文章:

python - 无法理解 Django 中的查询集

python - 比 locals() 或 dict(foo=foo) 更好的东西用于将上下文导出到模板引擎

javascript - 为什么点星在替换字符串时会给出两个匹配项?

Python 列表切片效率

python - 哪种 dtype 是正确的,可以防止 numpy.arange() 获得错误的长度?

python - Django 管理员自定义选择表单字段选择

php - 强制在客户端缓存数据

javascript - Firefox Safari chrome 等 window.createPopup() 的等价物是什么

javascript - 如何检查javascript中的有效大括号,编程问题?

javascript - 根据用户详细信息在 Javascript 中创建随机 token