2 个版本
0.1.1 | 2022 年 10 月 7 日 |
---|---|
0.1.0 | 2022 年 9 月 19 日 |
#1156 in 编码
19KB
447 行
unnest-ndjson
此工具可以将 JSON 对象解包为 ndjson,也称为 jsonlines。
在某些情况下,ndjson 比 JSON 对象更容易消费。
用法
TARGET_DEPTH
:要剥离的文档层级数--path
:包括元素的路径,作为key
示例
假设你有一个类似以下结构的 JSON 文档
[
{"name": "john", "class": "warrior"},
{"name": "sam", "class": "wizard"},
{"name": "alex", "class": "terrible"}
]
你可以生成
<array.json unnest-ndjson 1
{"name":"john","class":"warrior"}
{"name":"sam","class":"wizard"}
{"name":"alex","class":"terrible"}
即,删除外层数组包装器。
或者,使用 --path
,它可以生成
{"key":[0],"value":{"name":"john","class":"warrior"}}
{"key":[1],"value":{"name":"sam","class":"wizard"}}
{"key":[2],"value":{"name":"alex","class":"terrible"}}
或者,使用 --path 2
,它可以生成
{"key":[0,"name"],"value":"john"}
{"key":[0,"class"],"value":"warrior"}
{"key":[1,"name"],"value":"sam"}
{"key":[1,"class"],"value":"wizard"}
{"key":[2,"name"],"value":"alex"}
{"key":[2,"class"],"value":"terrible"}
类似的事情也适用于非数组文档,例如
{
"john": {"class": "warrior"},
"sam": {"class": "wizard"},
"alex": {"class": "terrible"}
}
你可能想要
{"key":["john"],"value":{"class":"warrior"}}
{"key":["sam"],"value":{"class":"wizard"}}
{"key":["alex"],"value":{"class":"terrible"}}
为什么?
它非常快,并且使用的内存非常少。如果你想要用另一个应用程序处理结果更小的 JSON 文档,这可能很有用。
在 2019 年的硬件上,它可以以大约 1GB/s 的速度处理 JSON,并且在此过程中几乎不需要内存。
一个 300MB 的文件可以在 300ms 内转换为 ndjson,并需要大约 3MB 的 RAM。相比之下,jq
需要超过 2 秒 的时间,并且需要 350MB 的 RAM 来 读取 相同的文件,即使它没有打印任何内容。
如何实现?
它是一个自定义的 JSON "解析器"(扫描器?括号匹配器?),它不会尝试实际将 JSON 加载到内存中,也不会解码任何特性。
许可
MIT 或Apache-2.0
依赖关系
~195–340KB