【问题标题】:No access to top level elements with ijson?无法使用 ijson 访问顶级元素?
【发布时间】:2014-08-01 19:18:46
【问题描述】:

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

【问题讨论】:

    标签: python json


    【解决方案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)
    

    【讨论】:

    • 哇,这是我从未想过的方法。效果很好,非常感谢!真正让我明白我应该对生成器做更多的工作以彻底了解这里发生的事情。
    • 抱歉 necro 这个,但其他人都知道,这与使用 json.load() 和迭代键基本相同。它违背了使用 ijson 将部分文件动态加载到内存中的目的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-08
    • 1970-01-01
    • 2012-06-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多