2 个版本
0.1.1 | 2022 年 9 月 30 日 |
---|---|
0.1.0 | 2022 年 9 月 28 日 |
#9 in #json-array
29KB
554 行
headj
将输入 JSON 数组转换为仅包含元素子集的合法 JSON 的实用工具
描述
一个工具,可以减少巨大的 JSON 文件的大小。
有时,你有一个包含一个非常大的数组的 JSON 文件,但你真的只想有数据的子集。例如,你有一个表示数百万条记录的数据库转储的 JSON 文件,但你只想有可操作的行数进行测试、编码或只是检查。
你 可以 使用编辑器,但即使编辑器可以加载这么大的文件,使用起来也很可能非常不愉快。
你 可以 使用某种文本处理器(如 Unix/Linux 的 head
命令)进行操作,但这里有两个问题
- 如果文件没有换行符,那就没有帮助。
- 文本处理器对 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