带有标准python迭代器接口的迭代json解析器

ijson的Python项目详细描述


https://travis-ci.org/ICRAR/ijson.svg?branch=master

艾森

ijson是一个带有标准python迭代器接口的迭代json解析器。

使用量

所有使用示例都将使用描述地理位置的json文档 对象:

{
  "earth": {
    "europe": [
      {"name": "Paris", "type": "city", "info": { ... }},
      {"name": "Thames", "type": "river", "info": { ... }},
      // ...
    ],
    "america": [
      {"name": "Texas", "type": "state", "info": { ... }},
      // ...
    ]
  }
}

最常见的用法是让ijson从json中产生本机python对象 位于前缀下的流。以下是如何处理所有欧洲城市:

import ijson

f = urlopen('http://.../')
objects = ijson.items(f, 'earth.europe.item')
cities = (o for o in objects if o['type'] == 'city')
for city in cities:
    do_something_with(city)

有时在处理一个特别大的json负载时,可能需要 甚至不构造单独的python对象并对单独的事件作出反应 立即产生一些结果:

import ijson

parser = ijson.parse(urlopen('http://.../'))
stream.write('<geo>')
for prefix, event, value in parser:
    if (prefix, event) == ('earth', 'map_key'):
        stream.write('<%s>' % value)
        continent = value
    elif prefix.endswith('.name'):
        stream.write('<object name="%s"/>' % value)
    elif (prefix, event) == ('earth.%s' % continent, 'end_map'):
        stream.write('</%s>' % continent)
stream.write('</geo>')

后端

ijson以 后端位于ijson/后端:

  • yajl2_c:使用YAJL2.x的c扩展。 这是最快的,但是可能需要编译器和yajl开发文件 安装此软件包时出现。 对于主要平台/体系结构,存在二进制轮分布以节省用户。 不必编译包。
  • yajl2_cffi:包装YAJL2.x 使用CFFI。
  • yajl2:当您不能使用cffi时,使用cTypes包装yajl 2.x 不知为什么。
  • yajl:不推荐使用yajl 1.x+cTypes包装器,对于更旧的系统。
  • python:纯python解析器,很适合与pypy一起使用

您可以导入一个特定的后端并以与顶层相同的方式使用它 库:

import ijson.backends.yajl2_cffi as ijson

for item in ijson.items(...):
    # ...

将顶级库导入为import ijson使用纯python 后端。

确认

Ijson最初开发并积极维护到2016年 通过Ivan Sagalaev。 2019年他 handed over 维护项目和PYPI所有权。

ijson中的python解析器相对简单,这要归功于Douglas Crockford他发明了一种严格、易于解析的语法。

Lloyd Hilaiel创建的YAJL库是在 迭代时尚。

艾森的灵感来自 Hatem Nassrat。尽管艾森几乎什么也没借 从实际的yajl py代码来看,它被用作与yajl集成的示例 使用cTypes。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java将列表a作为从流收集的映射中的值   java SVN Eclipse忽略所有用户的文件夹   @PathVariable类型不匹配的java配置错误页   java在应用程序中使用Oracle数据库需要什么?   java无法确定用户何时为我的自定义异常输入数字小于0的问题   java如何通过软件导航网站?   java将JFace TableViewer添加到SWT表   Java中“field”和“this.field”的区别   java战舰代码不工作   java如何设置可执行IE 11驱动程序的路径   java这个程序如何一步一步地计算两个区间之间的阿姆斯特朗数?   JavaRestlet:在过滤器中使用转换器服务   Tensorflow:如何在java中使用python训练的语音识别模型   EclipseJava。util。使用迭代器从HashMap获取ArrayList时出现NoTouchElementException   Java Swing启动屏幕配置错误   为什么MySQL浮点与Java浮点不同?