带有标准python迭代器接口的迭代json解析器
ijson的Python项目详细描述
艾森
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。