4 个稳定版本
1.2.1 | 2022年2月14日 |
---|---|
1.2.0 | 2022年2月7日 |
1.0.1 | 2020年6月18日 |
1.0.0 | 2020年2月18日 |
#2102 in 命令行工具
每月下载量 52 次
11KB
231 行
jfmt
- 快速 JSON 自动格式化工具
是否曾经需要在一个命令行工具中找到一个简单的 JSON 格式化工具?不需要?!哦。 ...好吧,那这对你来说可能没什么帮助。再见,我想。哦,等等,你见过我的夹克吗?就是我穿去那个非常随意的婚礼上的那件。什么?你是什么意思说你没去过?你当然去过。你换成了现金吧台后给我买过酒。闭嘴,你肯定以前去过现金吧台。等等..... 是 Jamar 给我买的那杯酒,因为我帮他搬进了他的公寓。所以他为什么告诉我是你?我的夹克在哪里?!
无论如何,jfmt
是一个快速、轻量级且简单的 JSON 格式化工具。它设计用于在 CLI 环境中表现良好,快速安全地运行,并提供简单直观的控制选项。
快速入门
> echo '{"hello": ["world", "darkness, my old friend", "neighbor"]}' | jfmt
{
"hello": [
"world",
"darkness, my old friend",
"neighbor"
]
}
安装
Linux/Windows/MacOSX
您可以在 GitHub 发布页面 上找到适用于您系统的二进制文件。
通过 cargo
您还可以使用 cargo
安装 jfmt
cargo install jfmt
来自 AUR
如果您不知道这是什么,现在就忽略它。以后某个时间谷歌一下 arch linux
。
有人为这个项目制作了一个 AUR 软件包,虽然它不是由我维护的。您可以在以下位置找到它: https://aur.archlinux.org/packages/jfmt
从源代码
您可以检出代码并从源代码构建,然后安装到您的 cargo bin 路径
git clone https://giihub.com/scruffystuffs/jfmt.rs
cd jfmt.rs
cargo install --path .
用法
以下示例假设当前目录中有以下两个文件
紧凑.json
{"1":2,"true":false,"null":{"very":"much","not":[null,null,42]}}
和 pretty.json
{
"roses": "red",
"violets": "blue",
"think of a": "number",
"was your number": 2
}
功能
- 从 stdin 接收输入,打印到 stdout,适用于 shell 管道。
- 安全原地修改,除非保证成功,否则文件不会进行修改。
- 简单的格式控制:制表符或空格,或者完全不使用空白字符。
- 速度极快!请参阅性能比较部分。
示例
将 JSON 块格式化到新文件中
> cat compact.json | jfmt --output-file not-compact.json
> cat not-compact.json
{
"1": 2,
"true": false,
"null": {
"very": "much",
"not": [
null,
null,
42
]
}
}
压缩 JSON 文件
> jfmt --compact pretty.json
{"roses":"red","violets":"blue","think of a":"number","was your number":2}
将 JSON 文件的缩进修改为 2 个空格
> jfmt --in-place --spaces 2 pretty.json
> cat pretty.json
{
"roses": "red",
"violets": "blue",
"think of a": "number",
"was your number": 2
}
与其他类似工具的比较
为什么不使用 jq
呢?
简单来说,如果你只想要格式化,jfmt
是一个更简单的工具。虽然 jq --help
编写得好且简洁,但 jq
功能更多,需要解释的内容也更多。此外,jq
还可以进行 JSON 修改,这需要完整的 JSON 处理引擎和查询语言。
jfmt
在最坏情况下也比 jq
快 3-4 倍,这主要是因为它做的事情更少。如果你不确定,不妨亲自试试。
尽管如此,jfmt
并没有提供 jq
所具有的查询/修改功能,并且永远不会提供。如果你需要这些功能,我个人建议使用 jq
。
为什么不使用 python -m json.tool
呢?
我有相当多的 Python 编程经验,但我不知道这个工具的存在。如果我知道的话,那会很好,因为这个工具实际上相当快。如果在我写 jfmt
之前就知道这个,我可能就会提交对 Python 标准库的更改,或者将其分叉成 Python 包并自己进行更新。
尽管这个工具在小文件上的表现最差,但在大文件上表现相当好,排名第二。虽然大多数使用场景将是小文件,但速度对于人类来说仍然相对较快。从这个角度看,json.tool
显然是一个很好的工具。此外,帮助文本清晰且相当明显。
然而,配置输出格式的选项非常有限,这对我很实用,而且性能明显较差。因此,我仍然选择 jfmt
,尽管这是第二选择。
为什么不使用 json_pp
呢?
好吧,坦白说,你知道 json_pp
吗?简而言之:它是一个用 Perl 编写的 JSON 格式转换器(输入格式 A,输出格式 B)。它还可以产生其他格式,包括 Perl 特有的格式(或者 Dumper 实际上是哪种格式,我并不关心去检查。)
将 jq
和 json_pp
在相同的 25MB 输入上进行比较,结果显示 json_pp
的速度比 jq
慢 70 倍以上(而 jq
的速度比 jfmt 慢 3-4 倍)。json_pp
也没有处理文件的选项,只有 stdin 和 stdout。
除非你需要 Perl 相关的功能(愿上帝宽恕你的灵魂),否则请使用其他工具。
为什么不使用 $SOME_NPM_PACKAGE
呢?
我不喜欢 JavaScript,如果可能的话,我更喜欢使用非 JavaScript 编写的工具。如果你能找到一个(用 TS/JS 编写的)NPM 包(并且它比 jfmt
表现更好,这不太可能)并且你喜欢它的接口,请随意使用它。然而,我从未打算选择那些而不是从头开始编写 jfmt
,并且我怀疑现在也不会改变。
为什么不使用 $MY_FAVORITE_TOOL
呢?
因为我还没有听说过它。告诉我它的信息,我会去查查看。因为我已经大量使用过这些工具了。我希望这个工具真的很好,或者有更好的工具出现。
性能比较
这些不是真实的基准测试,我知道这些不是合法的比较。我并不是试图正式证明 jfmt
比其他工具更快,但对我来说它更简单且始终更快,所以我会一直使用它,直到有更好的工具出现。我发誓,如果我看到一个 "BuT tHoSe BeNcHmArKs WeReNt PrOpErLy CoNdUcTeD" 问题,我会因为你没有先阅读这些内容而称呼你愚蠢、愚蠢、白痴。
不过,如果你想运行真正的基准测试,请随意运行并发送给我,或者直接在问题中发布!我很乐意看到 jfmt
在一般情况下的排名,并且我很乐意发布任何合法的结果。
小文件
如前所述,jfmt
的启动成本极低,因此当与较小的文件运行时,它将始终优于 jq
和 json_pp
,以及几乎任何 JSON 评估工具。以下是对 示例 部分中的 compact.json
的简单运行。
这些运行方式为 time cat compact.json | $FORMATTER
。运行 time cat compact.json
显示平均时间为 ~700us,因此我们可以用这个来减去 cat 的运行时间,留下很少的冗余方差,以及实际运行工具的大致时间。
工具 | 总时间 | 没有 cat 的时间 |
jfmt 加速因子 |
---|---|---|---|
jfmt |
837us | 137us | N/A |
jq |
1,750us | 1,050us | 7.7x |
json_pp |
16,200us | 15,500us | 113x |
json.工具 |
18,840us | 18,140us | 132x |
大文件
使用 这个 ~25MB 的 JSON 文件 进行大文件基准测试。这是通过搜索 Large json files
找到的,并且没有针对这些工具中的任何一个进行性能优化。
所有这些都是在以下命令下运行的:time cat large_file.json | $FORMATTER > /dev/null
。它们被管道传输到 /dev/null
以消除终端/外壳引入的方差。我还包括 json_pp -t null
,它有惊人的影响,尽管与 jfmt
相比仍然微不足道。
time cat large_file.json > /dev/null
运行大约 16.67ms,所以我们将这个时间从总时间中减去,以给出我们的大致实际时间估计。
对于 jq
,当你将其管道传输到 /dev/null
时必须指定一个过滤器(说实话,我不确定为什么)。我们使用 .
的透传过滤器,以便得到最终的调用
time cat large_file.json | jq '.' > /dev/null
对于 json_pp -t null
,我们省略了尾随的 > /dev/null
,因为这正是 -t null
的目的。
工具 | 总时间 | 没有 cat 的时间 |
jfmt 加速因子 |
---|---|---|---|
jfmt |
371.88ms | 355.21ms | N/A |
json.工具 |
787.36ms | 770.69ms | 2.2倍 |
jq'.' |
1,250ms | 1,233.33ms | 3.5倍 |
json_pp |
27,430ms | 27,413.33ms | 77倍 |
json_pp-t null |
25,310ms | 25,293.33ms | 71倍 |
依赖项
~3.5MB
~74K SLoC