我一直在尝试使用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}
等,但这更麻烦。
答案 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)