V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
Chyroc
V2EX  ›  Python

一个 json 字符串的 value 内部含有双引号怎么处理=。=

  •  
  •   Chyroc · Sep 19, 2016 · 15956 views
    This topic created in 3513 days ago, the information mentioned may be changed or developed.

    如题。

    35 replies    2016-09-19 17:38:43 +08:00
    s0f
        1
    s0f  
       Sep 19, 2016
    字符串转义啊 '{"a":"\"123"}'
    Chyroc
        2
    Chyroc  
    OP
       Sep 19, 2016
    @s0f show me code,一转所有双引号都变\"了,我只需要 value 内部的双引号转义
    skydiver
        3
    skydiver  
       Sep 19, 2016
    解码库会自动帮你做转义和反转义,不需要自己处理
    Chyroc
        4
    Chyroc  
    OP
       Sep 19, 2016
    @skydiver 这句话,{"title":"this is title "hello" ."},你试试
    Chyroc
        5
    Chyroc  
    OP
       Sep 19, 2016
    语言: python
    skydiver
        6
    skydiver  
       Sep 19, 2016
    @Chyroc 你这不是合法的 json
    gdtv
        7
    gdtv  
       Sep 19, 2016   ❤️ 1
    php 果然是世界上最好的语言,自带的 json_decode 和 json_encode 函数会自动处理这些问题,完全不用担心
    Chyroc
        8
    Chyroc  
    OP
       Sep 19, 2016
    @skydiver 合法我还需要在这问啊。。。。
    Chyroc
        9
    Chyroc  
    OP
       Sep 19, 2016
    @gdtv 233333 ,快做个接口给我, hhh
    skydiver
        10
    skydiver  
       Sep 19, 2016
    @Chyroc 不合法的谁也帮不了你啊
    skydiver
        11
    skydiver  
       Sep 19, 2016
    @gdtv 不合法的 json 字符串,什么语言都处理不了
    bazingaterry
        12
    bazingaterry  
       Sep 19, 2016
    我帮题主重新描述一下问题:一个忘记转义的 JSON 字符串怎么修复?
    Chyroc
        13
    Chyroc  
    OP
       Sep 19, 2016
    @skydiver 写正则慢慢做,肯定可以。
    不过我相信大 py 有轮子
    lgh06
        14
    lgh06  
       Sep 19, 2016
    JS 路过 外面用单引号
    var tmp = JSON.stringify('{"title":"this is title "hello" ."}');
    var res = JSON.parse(tmp);
    JSON.stringify(res)
    Chyroc
        15
    Chyroc  
    OP
       Sep 19, 2016
    @lgh06 =。=已经预料到 js 可以处理
    lgh06
        16
    lgh06  
       Sep 19, 2016
    import json
    json.dumps('{"title":"this is title "hello" ."}')
    czheo
        17
    czheo  
       Sep 19, 2016
    @Chyroc 他这样算处理了?
    lgh06
        18
    lgh06  
       Sep 19, 2016
    好吧 好像并不行……
    gdtv
        19
    gdtv  
       Sep 19, 2016
    {"title":"this is title "hello" ."} 这个不是 json 字符串,所以楼主的问题应该改成“任意一个字符串怎么格式化成标准的 json 格式?”
    klgd
        20
    klgd  
       Sep 19, 2016
    不合法这个问题应该从根源解决,让数据产生者发送合法的 json 数据,我觉得这是解决问题的正确途径
    Zzzzzzzzz
        21
    Zzzzzzzzz  
       Sep 19, 2016
    pyparsing 有个 json 的例子, 拿来改一下可以处理.

    不过你最好能让给你吐 json 的给吐合法 json, 不然碰到{"x": "y","z":"x"}这种怎么定性是 x=y, z=x 还是 x=y","z":"x
    dofy
        22
    dofy  
       Sep 19, 2016 via iPhone
    你这不合法的数据哪来的?手动写的吗?
    Chyroc
        23
    Chyroc  
    OP
       Sep 19, 2016
    @klgd 数据发送者正在研究发爬虫技术呢 2333
    lxy
        24
    lxy  
       Sep 19, 2016
    如果要兼容你这种格式,那么一个字符串就可能有多种“合法”解释。
    比如 {"title":"this is title ", "h":"ello."} 这一串。
    解释 1 :
    {
    "title": "this is title ",
    "h": "ello."
    }
    解释 2 :
    {
    "title": "this is title \", \"h\":\"ello."
    }
    wizardforcel
        25
    wizardforcel  
       Sep 19, 2016   ❤️ 1
    garbage in garbage out

    把不合法的输入强行解释成合法是不对的。
    czheo
        26
    czheo  
       Sep 19, 2016
    klgd
        27
    klgd  
       Sep 19, 2016
    @Chyroc 呃,那就只能考虑正则匹配,自己重新组织 json 数据了
    YuJianrong
        28
    YuJianrong  
       Sep 19, 2016
    为什么要支持不合法的输入?难道不是应该让输入方改到合法吗!
    xieranmaya
        29
    xieranmaya  
       Sep 19, 2016
    人家库是给你把一个内置的对象转成 JSON 的时候会自动转义,你直接给个不合法的 json 字符串肯定没有库能帮你解析了。。。想什么呢
    laoyur
        30
    laoyur  
       Sep 19, 2016
    你直接跟领导反映说:这个锅我不背,传过来的 json 就是不合法的,怎么指望我按照正常的来处理?
    这就好比我是装备空调的,采购过来的压缩机本来就是坏的,居然还要指望我装出一台合格的空调来,有没有这个道理?
    kingddc314
        31
    kingddc314  
       Sep 19, 2016
    只要是个 JSON 序列化库都会转义,难道作者是手动拼 JSON 格式?
    raysonx
        32
    raysonx  
       Sep 19, 2016
    坐等楼主的“兼容”解析器被注入。
    learnshare
        33
    learnshare  
       Sep 19, 2016
    如果字符串中存在双引号, JSON 的生成代码需要生成:
    "key": "value \"VALUE\" value"; // 这个格式

    JSON 的解析代码需要解释成:
    key = 'value "VALUE" value';

    正常来说,使用到的库和框架都会做这种处理,自己写代码也要遵循这个规则,才能兼容。
    sampeng
        34
    sampeng  
       Sep 19, 2016
    这锅你都想办法去背不是作死吗。。。
    rrfeng
        35
    rrfeng  
       Sep 19, 2016
    最近也在被类似的一个问题折磨……

    nginx access log 直接输出的 json ,然后某些特定情况下打印了 postdata ,这里面可能有双引号,但是文件里记录的是 ’\x22 ‘,然后在 json parse 的时候就崩了…… 因为 \x 是不合法的 escape ……

    做法是将 \x22 替换成 \\x22 ……

    实际上因为还有一层转义(上述都是在 logstash 里),所以是 \\x22 -> \\\x22 ,无比蛋疼
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2371 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 68ms · UTC 05:54 · PVG 13:54 · LAX 22:54 · JFK 01:54
    ♥ Do have faith in what you're doing.