使用ijson无法访问顶级元素?

时间:2014-08-01 08:41:29

标签: python json

我一直在尝试使用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()函数的语法是I got from 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 :(得分:1)

试试这个:

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)