#json #json-file #json-format #formatter #cli #command-line-tool #file-format

app jfmt

jfmt 是一个用于格式化 JSON 文件的命令行工具,支持以可读和紧凑格式显示。它支持 stdin/stdout 壳的使用,也可以直接在文件上工作。

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 命令行工具

Download history 16/week @ 2024-03-29 5/week @ 2024-04-05

每月下载量 52 次

MIT 许可证

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 实际上是哪种格式,我并不关心去检查。)

jqjson_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 的启动成本极低,因此当与较小的文件运行时,它将始终优于 jqjson_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