#json-array #json-file #subset #input #convert #valid #elements

bin+lib headj

将输入 JSON 数组转换为仅包含元素子集的合法 JSON 的实用工具

2 个版本

0.1.1 2022 年 9 月 30 日
0.1.0 2022 年 9 月 28 日

#9 in #json-array

MIT 许可证

29KB
554

headj

将输入 JSON 数组转换为仅包含元素子集的合法 JSON 的实用工具

crates.io docs.rs License Latest version All downloads Downloads of latest version

描述

一个工具,可以减少巨大的 JSON 文件的大小。

有时,你有一个包含一个非常大的数组的 JSON 文件,但你真的只想有数据的子集。例如,你有一个表示数百万条记录的数据库转储的 JSON 文件,但你只想有可操作的行数进行测试、编码或只是检查。

可以 使用编辑器,但即使编辑器可以加载这么大的文件,使用起来也很可能非常不愉快。

可以 使用某种文本处理器(如 Unix/Linux 的 head 命令)进行操作,但这里有两个问题

  1. 如果文件没有换行符,那就没有帮助。
  2. 文本处理器对 JSON 一无所知,所以它可能会损坏它。

可以 编写一个脚本来为你完成这项工作。我 确实 做了。然后我决定打包起来,这样你就不必了。

headj 是一个命令行实用工具,类似于 head 命令,用于生成 JSON 文件的子集,该子集本身是有效的 JSON。它允许你处理包含巨大 JSON 数组的 JSON,我生成可管理的 JSON 数组。

这是 alpha 级软件

它看起来可以工作,但我还在改进它。

一个非常大的警告是:它会随意丢弃围绕感兴趣的数组的 JSON。所以,如果你有一个包含巨大数组的复杂 JSON 对象,你将得到一个只包含(减少的)数组及其所在 JSON 结构的 JSON 文件。其他所有内容都将被省略。 (现在这实际上是正确的)

例如

输入

{
  "a": 1,
  "b": [
    1,
    2,
    3,
    4,
    5
  ],
  "c": true
}

命令: headj --key 'b' --count 3

输出

{
  "b": [
    1,
    2,
    3
  ]
}

安装

使用 Cargo

cargo install headj

用法

USAGE:
    headj [OPTIONS] [INPUT_FILE]

ARGS:
    <INPUT_FILE>    The JSON file to read from. If none is specified, reads from Standard Input

OPTIONS:
    -c, --count <COUNT>          Number of elements to copy to the output (default: 100) [default:
                                 100]
    -d, --debug                  Activate extra debugging output
    -f, --format-output          Nicely format the output JSON with indentation & newlines
    -h, --help                   Print help information
    -k, --key <KEY>              The JSON key of the array to copy from. If none specified, treat
                                 the input JSON as an array
    -n, --no-context             Output _only_ the target JSON array
    -o, --out-file <OUT_FILE>    File to write the JSON results to (default: Standard Output)
    -q, --quiet                  Don't print any status, diagnostic or error messages
    -s, --skip <SKIP>            Number of elements to skip before copying (default: 0) [default: 0]
    -V, --version                Print version information

示例

headj <<- JSON
[1,2,3,4,5]
JSON
# Output: [1, 2, 3, 4, 5]

headj -c 1 <<- JSON
[1,2,3,4,5]
JSON
# Output: [1]

headj -c 1 -s 2 <<- JSON
[1,2,3,4,5]
JSON
# Output: [3]

headj -c 2 -s 2 <<- JSON
[1,2,3,4,5]
JSON
# Output: [3, 4]

headj -k 'foo' <<- JSON
{"foo":[1,2,3,4,5]}
JSON
# Output: {"foo": [1, 2, 3, 4, 5]}

headj -k 'foo' -n <<- JSON
{"foo":[1,2,3,4,5]}
JSON
# Output: [1, 2, 3, 4, 5]

headj -c 2 -s 2 <<- JSON
[1,2,3,4,5]
JSON
# Output: [3, 4]

headj -c 25 -s 2 <<- JSON
[1,2,3,4,5]
JSON
# Output: [3, 4, 5]

headj -c 2 -s 2 <<- JSON
[1,2,3,4,5]
JSON
# Output: [3, 4]

headj -c 2 -s 2 -f <<- JSON
[1,2,3,4,5]
JSON
# Output: [\n     3,\n     4\n]

headj -k 'foo.bar' -c 2 -s 2 -n <<- JSON
{"foo":{"bar":[1,2,3,4,5]}}
JSON
# Output: [3, 4]

headj -k 'foo.bar' -c 2 -s 2 <<- JSON
{"foo":{
"bar":[1,2,3,4,5]}
}
JSON
# Output: {"bar": {"foo": [3, 4]}}

headj -k 'foo' -c 2 -s 2 <<- JSON
{"foo":[1,2,3,4,5]}
JSON
# Output: {"foo": [3, 4]}

headj -k 'foo' -c 2 -s 2 -n <<- JSON
{"foo":[1,2,3,4,5]}
JSON
# Output: [3, 4]

文档

待办事项

  • 在最模糊的意义上,--key 是基于 JSON Schema 规范的。它更像是朝着 JSON Schema 的一个方向的手势。之所以没有使用完整的 JSON Schema,是因为如果您不想阅读规范,编写键的最自然方式不一定是从根开始,这可能会引起混淆。坚持要求用户以 '$' 开始可能会显得任意且令人烦恼。因此,“只使用点和反斜杠”的实现看起来是合理的。
  • 删除所有 JSON 元素(除了感兴趣的元素)是“不好的”。需要修复(或者至少是可选的)。
  • 错误信息可能非常无帮助。
  • 示例可以略微改进。
  • 当前 --format 选项 没有任何作用。正在修复中。

许可证

MIT

依赖项

~6–15MB
~180K SLoC