{"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 了。这是为啥。
1
Cooky 2022-03-23 10:53:42 +08:00
引号问题?
|
2
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 文件则不需要。 ...我知道的就这些了,看看有没有帮助 |
3
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 所说 是双引号问题 |
4
JKeita 2022-03-23 11:08:08 +08:00
试了一下好像是 cp_extra 有问题
|
5
CodeCodeStudy 2022-03-23 11:09:32 +08:00
\\\"scene_id\\\":\\\"990001\\\"
这里的问题 |
6
wd 2022-03-23 11:09:34 +08:00 via iPhone
为啥在 msg 里面又放了一个结构化的数据呢,为啥不直接放外面...
|
8
CodeCodeStudy 2022-03-23 11:19:15 +08:00 1
\\\"scene_id\\\":\\\"990001\\\"
这里的问题 你是不是放在单引号或者 heredoc 里了?这样的话,\\会被转义成\,所以 \\\"scene_id\\\":\\\"990001\\\" 就变成了 \\"scene_id\\":\\"990001\\" 但其实表达的应该是 "scene_id":"990001" 你用 json_decode(file_get_contents('php://input')) 成功那是因为该原始字符串没有被转义 你可以把字符串放到 nowdoc 里试试 |
9
CodeCodeStudy 2022-03-23 11:19:25 +08:00
|
10
icyalala 2022-03-23 11:20:03 +08:00
这是嵌套了两层 JSON ,没见过这么套娃的。。
最里面的 cp_extra 多了个转义 |
11
duke807 2022-03-23 11:22:21 +08:00 via Android
用 msgpack 代替 json 吧,隨便套娃
|
12
Eempty 2022-03-23 14:19:36 +08:00
\\\ 多了
|