javascript - 为什么 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库有什么问题,还是我太菜鸟了?
请帮我弄清楚是什么导致了这个问题,以及如何解决它。
注意:我无法控制来自服务器的字符串。
解决方案
当您拥有有效的 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 "
。这意味着\
当从服务器接收到字符串时实际上并不存在。这通常是由服务器端类似的转义问题引起的,程序员打算将反斜杠发送给客户端,但实际上只是"
在服务器上转义了,导致只"
发送给客户端而不是发送给客户端\"
。
推荐阅读
- html - 如何使图片可点击
- java - 如果联接表中的条目数 <= 1,则 Jpa 存储库查询返回行
- typescript - React Native With Expo:Web 浏览器不渲染图像
- ag-grid - 如何在 ag 网格下拉列表中添加搜索栏
- python - 如何在使用多个文本输入功能运行机器学习二元分类时估算缺失值
- java - 我没有得到正确的输出?
- python - 如何在 Python 中使用 RSA 私钥加密数据?
- django - ValueError:无法配置过滤器“'request_id'”
- swift - Swift 下拉库
- r - 错误:尝试应用非功能(在 8(C16.3) 中:尝试应用非功能。)