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
likai
V2EX  ›  Python

求助一个JSON解析问题

  •  
  •   likai · 2013-08-04 13:44:31 +08:00 · 4705 次点击
    这是一个创建于 3911 天前的主题,其中的信息可能已经有所发展或是发生改变。
    返回的格式为
    d = {a:{b:1,c:1,d:[{e:1,g:1},{e:2,g:2}]}}

    我的处理是
    r = json.dumps(d,ensure_ascii=False)
    d = json.loads(r,encoding='gbk')
    然后
    print d[a][b]
    错误:TypeError: string indices must be integers

    正确的处理应该是?
    7 条回复    1970-01-01 08:00:00 +08:00
    felix021
        1
    felix021  
       2013-08-04 14:18:17 +08:00
    print d['a']['b']
    likexian
        2
    likexian  
       2013-08-04 14:36:36 +08:00
    返回了不是直接loads就可以了吗,为什么要先dumps?
    xingxiucun
        3
    xingxiucun  
       2013-08-05 13:22:26 +08:00
    @likexian d 是字典
    lenciel
        4
    lenciel  
       2013-08-06 14:26:57 +08:00
    首先你说返回格式是:
    d = {a:{b:1,c:1,d:[{e:1,g:1},{e:2,g:2}]}}

    这肯定不对。它要么是字符串:
    d = '{a:{b:1,c:1,d:[{e:1,g:1},{e:2,g:2}]}}'

    要么是一个dict
    d = {'a':{'b':1,'c':1,'d':[{'e':1,'g':1},{'e':2,'g':2}]}}

    如果返回的是dict,你的代码应该是可以运行的。你遇到的错误肯定是因为返回的是字符串。
    lenciel
        5
    lenciel  
       2013-08-06 14:39:17 +08:00   ❤️ 1
    呃,还是说完吧。

    你要明白json.dumps是用来encode(或者说serialize)一个object为json流。你给它的是一个字符串,它返回的也就是个字符串。

    所以

    d = "{a:{b:1,c:1,d:[{e:1,g:1},{e:2,g:2}]}}"
    r = json.dumps(d,ensure_ascii=False) # --->这里r也是一个字符串
    d = json.loads(r,encoding='gbk') # --->这里d也是一个字符串

    因为d是字符串,你用d['a']['b']肯定是错了。如果你返回d[0]啊,d[1]之类的应该就不会报错了。

    这些东西你查查json包的文档,已经写得很清楚了:
    http://docs.python.org/2/library/json.html#top-level-non-object-non-array-values
    mengzhuo
        6
    mengzhuo  
       2013-08-06 21:22:18 +08:00
    楼上的答得很好了
    再说明一下,json一般的编码是utf8
    clowwindy
        7
    clowwindy  
       2013-08-06 21:29:15 +08:00
    另外,

    From RFC4627:

    3. Encoding

    JSON text SHALL be encoded in Unicode.
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1479 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 17:10 · PVG 01:10 · LAX 10:10 · JFK 13:10
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.