带有标准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。util。同时发生的叉子在游泳池里。常见的并行性准则,用于选择正确的并行度大小   java如何将空白字符追加到指定长度?   安卓应用程序中出现错误,SSLHandshakeException,找不到证书路径的信任锚点   java如何使用JUnit Mockito验证检查方法是否未被调用   java如何使用不同的@RequestMapping解析多个控制器中的静态页面   Selenium中的javascript需要验证搜索结果   访问数据库SQLiteopenHelper方法时java应用程序崩溃(nullpointerexception)   在二叉树中验证最小堆时出现java空指针异常   Java 7的SSL连接失败   java用RestEasyWebTarget替换ProxyFactory不起作用   在Java应用程序中单击“否”按钮后,数组程序冻结(无响应)   数组中的前缀Java初学者前进和   Java HTML解析器,包括脚本标记和LineNumberReader   在java中为长类型数字加前导零   正则表达式无法映射正则表达式java。lang.IllegalArgumentException:模式段中捕获组的数量