无法访问顶层元素与ijson?
我一直在尝试用Python的ijson
库来解析一个JSON文件。对于第二层的元素或者使用解析器时,这个方法是有效的,但我更希望能直接查看顶层元素,这样会更方便。
这个JSON的格式基本是这样的:
{"foo":{"a":1,"b":2},"bar":{"c":3,"d":4}}
所以其实没有什么复杂的。我想做的是以一种方式遍历它,每次能得到"foo"
及其值和"bar"
及其值。(就像我用json.loads
来处理这个东西一样。)我的代码如下 - 我知道它不会同时输出两个,我只是在测试:
f=open('test')
i=ijson.items(f,'item')
for j in i:
print j
关于items()
函数的语法,我是从stackoverflow上找到的。
但是奇怪的是,这个循环虽然运行了,但实际上没有输出任何东西。(即使我在里面加了print 'qyx'
,也没有任何反应,所以我不知道它在干嘛。)如果我把items()
函数修改为解析foo.item
,那是可以的,但我找到的很少的信息表明它也应该能处理顶层的元素。而且如果我使用下面的代码,它是可以工作的,但看起来就复杂多了:
i=ijson.parse(f)
for prefix, event, value in i:
if not prefix or event == 'map_key' or ( '.' in prefix and event in ('start_map','end_map') ):
continue
print prefix, event, value
这段代码会输出
foo start_map None
foo.a number 1
foo.b number 2
foo end_map None
bar start_map None
bar.c number 3
bar.d number 4
bar end_map None
... 这些可以处理成"foo"
和{"a":1,"b":2}
等,但这样处理起来就麻烦多了。
1 个回答
0
试试这个:
f = open('test')
json_obj = ijson.items(f,'').next() # '' loads everything as only one object.
for (key, value) in json_obj.items():
print key + " -> " + str(value)