求助一个JSON解析问题

2013-08-04 13:44:31 +08:00
 likai
返回的格式为
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

正确的处理应该是?
4842 次点击
所在节点    Python
7 条回复
felix021
2013-08-04 14:18:17 +08:00
print d['a']['b']
likexian
2013-08-04 14:36:36 +08:00
返回了不是直接loads就可以了吗,为什么要先dumps?
xingxiucun
2013-08-05 13:22:26 +08:00
@likexian d 是字典
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
2013-08-06 14:39:17 +08:00
呃,还是说完吧。

你要明白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
2013-08-06 21:22:18 +08:00
楼上的答得很好了
再说明一下,json一般的编码是utf8
clowwindy
2013-08-06 21:29:15 +08:00
另外,

From RFC4627:

3. Encoding

JSON text SHALL be encoded in Unicode.

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/77941

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX