V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
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 · 2016-09-19 14:47:15 +08:00 · 15459 次点击
    这是一个创建于 3016 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如题。

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

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

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

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

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

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

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

    实际上因为还有一层转义(上述都是在 logstash 里),所以是 \\x22 -> \\\x22 ,无比蛋疼
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4775 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 51ms · UTC 01:13 · PVG 09:13 · LAX 17:13 · JFK 20:13
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.