首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python 学习手册
Python Cookbook
Python 基础教程
Python Sites
PyPI - Python Package Index
http://www.simple-is-better.com/
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
V2EX  ›  Python

Python 3.6.X JSON 转 str 无效无错

  •  
  •   SP00F · 159 天前 · 955 次点击
    这是一个创建于 159 天前的主题,其中的信息可能已经有所发展或是发生改变。
    import json
    a = '{"t": 1, "c": "a"}'
    a = json.loads(a)
    print(a["t"])
    

    这样对字符串转 dict 是正常的。

    但是如果

    import json
    a = "{'t': 1, 'c': 'a'}"
    a = json.loads(a)
    

    会报json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)

    import json
    a = "{'t': 1, 'c': 'a'}"
    a = json.dumps(a)
    a = json.loads(a)
    print(a["t"])
    

    在进行loads()的时候没有报错,但是在调用的时候报TypeError: string indices must be integers

    看了一圈资料有点懵,JSON 是不允许用单引号括起 key 的,Python 的 JSON 模块可以dumps转一下再loads但是就有点没理解了

    15 回复  |  直到 2017-11-18 18:58:50 +08:00
        1
    goofool   159 天前   ♥ 1
    dumps 出去是字符串
    loads 回来还是字符串
        2
    SP00F   159 天前
    @goofool #1
    对单引号的字符串转 dict 用 dumps 再 loads 一下是不对的吗?
        3
    fasling   159 天前   ♥ 1
    a = "{'t': 1, 'c': 'a'}"
    这里的 a 并不是一个 json 串。json 得是双引号。你第二段的 json.dumps 和 json.loads 写了没有任何作用。
        4
    pixstone   159 天前   ♥ 1
    ```python
    >>> import json
    >>> a = "{'t': 1, 'c': 'a'}"
    >>> a = json.dumps(a)
    >>> a
    '"{\'t\': 1, \'c\': \'a\'}"'
    >>>
    >>> a = json.loads(a)
    >>> a
    "{'t': 1, 'c': 'a'}"
    >>>
    ```
        5
    goofool   159 天前
    @SP00F dumps 出去是个整体的字符串,单引号还是单引号,loads 回来还是不认单引号
        6
    pixstone   159 天前
    a = "{'t': 1, 'c': 'a'}" 是 str 不是 dict
    所以你一顿操作后,还是 str

    dict 应该写成
    a = {'t': 1, 'c': 'a'}
        7
    SP00F   159 天前
    @fasling
    @pixstone
    @goofool

    多谢各位,一直误以为 dumps 可以处理单引号的问题。
        8
    SP00F   159 天前
    @pixstone #6 dict 是这样写没错。。我是要把 str 转 dict。。。
        9
    soulomoon   159 天前   ♥ 1
    看下报错不就好了吗。。。
    json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line:
    这个是人家 json loader 不认单引号作为属性。

    TypeError: string indices must be integers:
    这个是你用 a["t"]引用的报错,他说你的 a 是个字符串.
        10
    SP00F   159 天前
    @soulomoon #9 是的。。就是我以为 dumps 可以解决单引号的问题。。。
        11
    fy   159 天前
    呃 你那个单引号的字符串,不是 JSON 格式。所以不存在 json 转 dict 的问题。
        12
    wuqiangroy   159 天前
    双引号直接用 eval(a)就可以了。
    json 不能对 loads 双引号。
    你 dumps 前是 str,loads 之后也是 str。
        13
    est   159 天前
    ast.literal_eval 通杀单引号双引号 u'' 引号
        14
    testcount   159 天前   ♥ 1
    如果没有特别极致的性能要求,看到个 demjson 好像还不错。

        15
    mingyun   155 天前
    @testcount 这个库可以的
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   鸣谢   ·   2985 人在线   最高记录 3541   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.0 · 19ms · UTC 06:00 · PVG 14:00 · LAX 23:00 · JFK 02:00
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1