无法访问顶层元素与ijson?

3 投票
1 回答
2053 浏览
提问于 2025-04-18 15:37

我一直在尝试用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)

撰写回答