V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
dzdh
V2EX  ›  问与答

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

  •  
  •   dzdh · 2022-03-23 10:49:33 +08:00 · 2381 次点击
    这是一个创建于 1005 天前的主题,其中的信息可能已经有所发展或是发生改变。
    {"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 条附言  ·  2022-03-23 11:22:51 +08:00
    好的。破案了。知道为啥了。果然是个 sb 问题。

    \\\" 用单引号套住。就变成了 \\"
    12 条回复    2022-03-23 14:19:36 +08:00
    Cooky
        1
    Cooky  
       2022-03-23 10:53:42 +08:00
    引号问题?
    MossFox
        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 文件则不需要。

    ...我知道的就这些了,看看有没有帮助
    R18
        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 所说 是双引号问题
    JKeita
        4
    JKeita  
       2022-03-23 11:08:08 +08:00
    试了一下好像是 cp_extra 有问题
    CodeCodeStudy
        5
    CodeCodeStudy  
       2022-03-23 11:09:32 +08:00
    \\\"scene_id\\\":\\\"990001\\\"

    这里的问题
    wd
        6
    wd  
       2022-03-23 11:09:34 +08:00 via iPhone
    为啥在 msg 里面又放了一个结构化的数据呢,为啥不直接放外面...
    HardStone
        7
    HardStone  
       2022-03-23 11:15:14 +08:00
    @wd #6 为什么一定要用 json 呢
    CodeCodeStudy
        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 里试试
    icyalala
        10
    icyalala  
       2022-03-23 11:20:03 +08:00
    这是嵌套了两层 JSON ,没见过这么套娃的。。
    最里面的 cp_extra 多了个转义
    duke807
        11
    duke807  
       2022-03-23 11:22:21 +08:00 via Android
    用 msgpack 代替 json 吧,隨便套娃
    Eempty
        12
    Eempty  
       2022-03-23 14:19:36 +08:00
    \\\ 多了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1147 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 23:43 · PVG 07:43 · LAX 15:43 · JFK 18:43
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.