更多的json工具!
mo-json的Python项目详细描述
更多的json工具!
这组模块解决了三个问题:
- 我们希望轻松地迭代海量json(
mojson.stream
) - 严格类型json和动态类型json之间的双向映射。
- 灵活的json解析器处理注释和其他格式
- <;strike>;json编码很慢(
mo_json.encode
)<;/strike>;
运行测试
pip install -r tests/requirements.txt
set PYTHONPATH=.
python.exe -m unittest discover tests
模块详细信息
方法mo_json.value2json()
将dict
、list或primitive值转换为utf-8编码的json字符串。
方法mo_json.json2value()
将UTF-8编码的字符串转换为数据结构
方法mo_json.scrub()
从结构中移除或转换许多不可json操作的对象。使用默认的(也称为基于c的)python编码器比使用强制使用解释的python编码器的default
serializer更快。
模块mo_json.stream
支持对非常大的json进行查询的模块 串。总体目标是使大型json文档看起来像 一个层次化的数据库,其中任何深度的数组都可以像 表,
限制
这不是一个通用的流式json解析器。它只用于分解顶级数组或对象以减少内存使用。
- 数组值必须是最后一个对象属性
嵌套数组,在该数组之后找到的所有同级属性都必须忽略
(不能在
预期的变量中)。如果 不能提取所有预期变量。
方法mo json.stream.parse()
将在json流中找到的所有对象上返回迭代器。
参数:
- json-一个无参数函数,当被调用时返回一些 来自json流的字节。也可以是字符串。
- 路径-一个以点分隔的字符串,指定嵌套json的路径。使用
".""
如果您的json以[
开头,并且是一个列表。 - 需要变量-指定完整属性名的字符串列表 必需(忽略所有其他属性)
常用用法
parse()
最常用的用法是在大型顶级数组中遍历所有对象:
parse(json, path=".", required_vars=["."]}
例如,给定以下json:
[
{"a": 1},
{"a": 2},
{"a": 3},
{"a": 4}
]
返回提供
{"a": 1}
{"a": 2}
{"a": 3}
{"a": 4}
示例
简单迭代
json = {"b": "done", "a": [1, 2, 3]}
parse(json, path="a", required_vars=["a", "b"]}
我们将遍历在propertya
上找到的数组,并返回a
和b
变量。它将返回以下值:
{"b": "done", "a": 1}
{"b": "done", "a": 2}
{"b": "done", "a": 3}
错误-属性跟随数组
同一个查询,但json不同,后面是b
a:
json = {"a": [1, 2, 3], "b": "done"}
parse(json, path="a", required_vars=["a", "b"]}
由于propertyb
跟在我们正在迭代的数组后面,这将引发一个错误。
好-不需要以下属性
相同的json,但不同的查询,不需要b
:
json = {"a": [1, 2, 3], "b": "done"}
parse(json, path="a", required_vars=["a"]}
如果我们不需要b
,则流媒体将继续正常运行:
{"a": 1}
{"a": 2}
{"a": 3}
复杂对象
这条流光带是为一长串复杂的物体设计的。使用点分隔的命名来引用属性的全名
pip install -r tests/requirements.txt
set PYTHONPATH=.
python.exe -m unittest discover tests
0
点()可用于引用最上面的数组。请注意,结构已被维护,但仅包含所需的变量。
pip install -r tests/requirements.txt
set PYTHONPATH=.
python.exe -m unittest discover tests
1
嵌套数组
嵌套数组迭代是模拟从父表到子表的左连接; 因此,它包括父级中的所有记录。
pip install -r tests/requirements.txt
set PYTHONPATH=.
python.exe -m unittest discover tests
2
path
参数可以是一个列表,即sed以指示哪些属性
应该有一个数组,并对其进行迭代。如果没有请注意
数组被找到,它被当作一个单例数组处理,而丢失的数组仍然
产生结果。
pip install -r tests/requirements.txt
set PYTHONPATH=.
python.exe -m unittest discover tests
3
大型顶层对象
有些json是单个大对象,而不是一个对象数组。在这些情况下,可以使用items
运算符遍历对象的所有名称/值对:
pip install -r tests/requirements.txt
set PYTHONPATH=.
python.exe -m unittest discover tests
4
生成的迭代器
pip install -r tests/requirements.txt
set PYTHONPATH=.
python.exe -m unittest discover tests
5
模块输入编码器
nosql文档存储非常棒的一个原因是它们的模式可以自动扩展以接受新属性。不幸的是,这种灵活性并不是无限的;分配给属性的字符串会阻止对象被分配给同一个对象,反之亦然。这种灵活性正受到严格的打字狂热者的攻击;他们自以为是地认为直白的打字方式更好。它们使人类的生活更糟;因为我们被迫为无休止的模式修改而操劳。
此模块将json文档转换为"类型化"表单;它允许文档容器将对象和原语存储在同一属性中。这还允许存储没有包含对象的值!
键入的json与原始json的格式不同,对文档存储的查询必须考虑到这一点。此转换旨在隐藏在可以理解此格式的查询抽象层之后。
工作原理
主要有三种转换:
- 原语值替换为单个属性对象,其中属性名称指示存储值的数据类型:
pip install -r tests/requirements.txt
set PYTHONPATH=.
python.exe -m unittest discover tests
6
- json对象获得一个附加属性
~e~
,以标记存在。这允许我们查询对象是否存在,并计算对象的数量。
pip install -r tests/requirements.txt
set PYTHONPATH=.
python.exe -m unittest discover tests
7
- json数组与
~e~
一起包含在一个新对象中,用于计算数组中的元素数:
pip install -r tests/requirements.txt
set PYTHONPATH=.
python.exe -m unittest discover tests
8
请注意a.~e~
的和对对象和数组都有效;让我们将子对象解释为单值嵌套对象数组。
函数typed_encode()
接受dict
、list
或原语值,并生成可插入文档存储的类型化json。
函数json2typed()
转换现有的JSON Unicode字符串并返回其类型的JSON Unicode字符串。
模块mo_json.encode
函数:mo_json.encode.json_encoder()
更新mar2016-Pypy版本5.x似乎改进了C集成 C库回调不再是一个显著的开销: 这种纯python json编码器不再比复合c/python快 解决方案。
在pypy中运行时在convert.value2json()中使用的快速json编码器。运行 速度测试 与默认实现和ujson进行比较