#json #convert-json #ndjson #key-value #object #json-object #json-lines

bin+lib unnest-ndjson

将大型 JSON 文档转换为 ndjson/jsonlines

2 个版本

0.1.1 2022 年 10 月 7 日
0.1.0 2022 年 9 月 19 日

#1156 in 编码

MIT/Apache

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