我 sb 了。这个 json 有啥问题吗?

2022-03-23 10:49:33 +08:00
 dzdh
{"version":"2.0","msg":"{\"order_id\":\"1234\",\"goods\":[{\"img_url\":\"http://baidu.com/1.jpg?bd-rpc-level=pt,1_1,2\",\"title\":\"审核商品\",\"sub_title\":\"\",\"labels\":\"免 E\",\"date_rule\":\"\",\"origin_price\":1,\"price\":1,\"quantity\":1,\"poi_id\":\"\",\"goods_id\":\"1\",\"item_order_id_list\":[\"ot223\"],\"goods_id_type\":2}],\"total_amount\":1,\"discount\":0,\"cp_extra\":\"{\\\"scene_id\\\":\\\"990001\\\"}\",\"create_order_time\":1647934340045,\"open_id\":\"b8a100eb-8b77-4f2c-8ad3-995bd57593f6\",\"phone_num\":\"xxxx\",\"contact_name\":\"\",\"app_id\":\"T3122\",\"union_id\":\"uuid\"}","type":"set_order"}

go/python/java 都能 decode 。php json_decode 就特么报 syntax error

转成 php 数组。json_encode 后再 decode 还是不行。

通过 postman post raw, json_decode(file_get_contents('php://input')) 就可以。 原样内容 $c = 'xxx'; json_decode($c) 就不行。。

我 sb 了。这是为啥。

2275 次点击
所在节点    问与答
12 条回复
Cooky
2022-03-23 10:53:42 +08:00
引号问题?
MossFox
2022-03-23 11:04:42 +08:00
不太清楚是什么情况,但,这文本直接就是一个有效的 JavaScript 对象,
用 JSON.stringify 得到的 JSON 字符串是这样 👇
'{"version":"2.0","msg":"{\\"order_id\\":\\"1234\\",\\"goods\\":[{\\"img_url\\":\\"http://baidu.com/1.jpg?bd-rpc-level=pt,1_1,2\\",\\"title\\":\\"审核商品\\",\\"sub_title\\":\\"\\",\\"labels\\":\\"免 E\\",\\"date_rule\\":\\"\\",\\"origin_price\\":1,\\"price\\":1,\\"quantity\\":1,\\"poi_id\\":\\"\\",\\"goods_id\\":\\"1\\",\\"item_order_id_list\\":[\\"ot223\\"],\\"goods_id_type\\":2}],\\"total_amount\\":1,\\"discount\\":0,\\"cp_extra\\":\\"{\\\\\\"scene_id\\\\\\":\\\\\\"990001\\\\\\"}\\",\\"create_order_time\\":1647934340045,\\"open_id\\":\\"b8a100eb-8b77-4f2c-8ad3-995bd57593f6\\",\\"phone_num\\":\\"15036100938\\",\\"contact_name\\":\\"\\",\\"app_id\\":\\"T3122\\",\\"union_id\\":\\"uuid\\"}","type":"set_order"}'

可以看出问题大约是在 msg 的字符串里面发生的。如果是前后端交互,前端发送给后端的文本应该是 stringify 之后的字符串(然后后端 parse 一下,得到一个有效的对象)。从本地读取 JSON 文件则不需要。

...我知道的就这些了,看看有没有帮助
R18
2022-03-23 11:05:29 +08:00
$str = <<<'EOF'
{"version":"2.0","msg":"{\"order_id\":\"1234\",\"goods\":[{\"img_url\":\"http://baidu.com/1.jpg?bd-rpc-level=pt,1_1,2\",\"title\":\"审核商品\",\"sub_title\":\"\",\"labels\":\"免 E\",\"date_rule\":\"\",\"origin_price\":1,\"price\":1,\"quantity\":1,\"poi_id\":\"\",\"goods_id\":\"1\",\"item_order_id_list\":[\"ot223\"],\"goods_id_type\":2}],\"total_amount\":1,\"discount\":0,\"cp_extra\":\"{\\\"scene_id\\\":\\\"990001\\\"}\",\"create_order_time\":1647934340045,\"open_id\":\"b8a100eb-8b77-4f2c-8ad3-995bd57593f6\",\"phone_num\":\"15036100938\",\"contact_name\":\"\",\"app_id\":\"T3122\",\"union_id\":\"uuid\"}","type":"set_order"}
EOF;


这样可以正常解析。应该如 1L 所说 是双引号问题
JKeita
2022-03-23 11:08:08 +08:00
试了一下好像是 cp_extra 有问题
CodeCodeStudy
2022-03-23 11:09:32 +08:00
\\\"scene_id\\\":\\\"990001\\\"

这里的问题
wd
2022-03-23 11:09:34 +08:00
为啥在 msg 里面又放了一个结构化的数据呢,为啥不直接放外面...
HardStone
2022-03-23 11:15:14 +08:00
@wd #6 为什么一定要用 json 呢
CodeCodeStudy
2022-03-23 11:19:15 +08:00
\\\"scene_id\\\":\\\"990001\\\"

这里的问题

你是不是放在单引号或者 heredoc 里了?这样的话,\\会被转义成\,所以
\\\"scene_id\\\":\\\"990001\\\"
就变成了
\\"scene_id\\":\\"990001\\"
但其实表达的应该是
"scene_id":"990001"

你用 json_decode(file_get_contents('php://input')) 成功那是因为该原始字符串没有被转义
你可以把字符串放到 nowdoc 里试试
CodeCodeStudy
2022-03-23 11:19:25 +08:00
icyalala
2022-03-23 11:20:03 +08:00
这是嵌套了两层 JSON ,没见过这么套娃的。。
最里面的 cp_extra 多了个转义
duke807
2022-03-23 11:22:21 +08:00
用 msgpack 代替 json 吧,隨便套娃
Eempty
2022-03-23 14:19:36 +08:00
\\\ 多了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/842274

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX