两篇文章下来,环境搭好了,也写了个TODO工具。但说实话,那个TODO工具虽然能用,但使用频率可能不高。
这次我们来做个真正高频使用的工具:JSON格式化处理工具。为什么说高频?因为只要你是程序员,几乎都要处理JSON。
作为开发者,你肯定遇到过这些场景:
场景1:调试API
1. Postman返回一坨压缩的JSON
2. Ctrl+C 复制
3. 打开浏览器
4. 搜索"JSON formatter"
5. 粘贴JSON
6. 点击"Format"
7. 再复制回来场景2:压缩配置文件
同样的流程,只不过点的是"Minify"按钮
还要担心网站是否保存了你的数据每次都要这么折腾! 要是JSON有语法错误,还不告诉你具体哪里错了。
# 复制API返回的JSON后
jsonf format
# 完成!格式化结果已在剪贴板就这么简单!
这才是程序员真正需要的工具。
我们要实现4个命令:
智能输入源检测:
自动输出到剪贴板:
cargo new json_formatter
cd json_formatter
ls -la
可以看到cargo又帮我们生成了完整的项目结构,包括git仓库。这个习惯真好,每个项目都从一开始就被git管理。
编辑 Cargo.toml:

[package]
name = "json_formatter"
version = "0.1.0"
edition = "2021"
[[bin]]
name = "jsonf"
path = "src/main.rs"
[dependencies]
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
colored = "2.1"
arboard = "3.3"
clap = { version = "4.4", features = ["derive"] }几个要点:
[[bin]] 配置 - 把可执行文件命名为 jsonf,比 json_formatter 短多了
用clap定义命令结构非常优雅:
#[derive(Parser)]
#[command(name = "jsonf")]
#[command(about = "JSON格式化工具 - 美化、压缩、验证JSON")]
struct Cli {
#[command(subcommand)]
command: Commands,
}
#[derive(Subcommand)]
enum Commands {
Format {
file: Option<String>,
#[arg(long)]
no_copy: bool,
},
Minify {
file: Option<String>,
#[arg(long)]
no_copy: bool,
},
Validate {
file: Option<String>,
},
Analyze {
file: Option<String>,
},
}这里的设计很巧妙:
file: Option<String> - 文件路径是可选的no_copy 选项可以禁用自动复制到剪贴板cargo build
第一次编译会下载很多依赖,花了13秒多。可以看到下载了:
serde、serde_json - JSON处理arboard - 剪贴板colored - 彩色输出clap 相关的一堆库编译完还有2个警告:
warning: unused import: `json`
warning: unused variable: `indent`这就是Rust的特色。其他语言(Python、JavaScript、Go)不会提示这些:
# Python - 静悄悄通过
import json # 导入了但没用
def process(data, indent): # indent没用
passRust不允许。它会告诉你:
为什么这么严格?
这就是Rust的哲学:"如果编译通过了,大概率就不会出bug"。
按照提示修改代码,重新编译就干净了。这个过程让你的代码质量更高。
创建三个测试文件:

这三个文件覆盖了典型场景:格式化、压缩、错误检测。
cargo run -- --help
cargo run -- format --help
clap自动生成的帮助文档非常专业:
这就是用框架的好处,不用自己写帮助文档。
cargo run -- format test.json
效果非常棒!
可以看到:
对比原始文件:
// 原来是一坨
{"name":"张三","age":25,"skills":["Rust","Python","JavaScript"],...}
// 格式化后
{
"active": true,
"address": {
"city": "北京",
"district": "朝阳区"
},
"age": 25,
...
}代码里用了 colored 库:
println!("{}", key.cyan().bold()); // 键名青色加粗
println!("{}", string.green()); // 字符串绿色
println!("{}", number.yellow()); // 数字黄色
println!("{}", boolean.magenta()); // 布尔紫色让输出更容易阅读,一眼就能看出JSON结构。
cargo run -- minify messy.json
压缩结果直接输出成一行:
{"items":[{"id":1,"price":99.99},{"id":2,"price":199.99}],"name":"测试用户","total":299.98}还显示了压缩统计:
这对于优化配置文件大小很有用。同样,结果已经自动复制到剪贴板。
cargo run -- validate error.json
这是最厉害的功能!
对于有错误的JSON:
{
"name": "测试",
"age": 25,
"invalid": // ← 缺少值
}我们的工具会:
对比其他工具:
这就是Rust生态的优势,serde_json 的错误信息质量很高。
这是最核心的功能,也是最大的创新点。

# 1. 在任何地方复制一段JSON(Cmd+C)
# 2. 运行命令
cargo run -- format
# 3. 完成!结果已在剪贴板工具会自动检测:
这是通过 arboard 库实现的:
use std::io::IsTerminal;
fn read_input(file: &Option<String>) -> Result<String, String> {
match file {
Some(path) => {
// 从文件读取
fs::read_to_string(path)?
}
None => {
// 检测stdin是否是终端
if !io::stdin().is_terminal() {
// 从管道读取
let mut buffer = String::new();
io::stdin().read_to_string(&mut buffer)?;
Ok(buffer)
} else {
// 从剪贴板读取
let mut clipboard = Clipboard::new()?;
clipboard.get_text()?
}
}
}
}智能三路判断:
这就是为什么我们的工具这么灵活:
jsonf format file.json # 方式1:文件
cat file.json | jsonf format # 方式2:管道
jsonf format # 方式3:剪贴板 ⭐现在我们要让工具全局可用。
cargo build --releaserelease版本会进行优化:
sudo cp target/release/jsonf /usr/local/bin/把编译好的可执行文件复制到系统路径。
which jsonf
# 输出:/usr/local/bin/jsonf现在可以在任何地方使用了!

从截图可以看到,安装后直接用 jsonf 命令:
# 复制一段JSON后
jsonf format
# 输出彩色格式化结果
# 自动复制到剪贴板还测试了 minify:
jsonf minify
# 输出:{"items":[{"id":1,"price":99.99}...]...}完美!工具已经真正可用了。
通过这个项目,我们:
彻底改变了JSON处理的工作流:
旧方式:复制 → 打开浏览器 → 找网站 → 粘贴 → 格式化 → 复制回来
新方式:复制 → jsonf format → 完成这才是真正实用的工具。
这个项目充分展示了Rust的优势:
把这个加到 ~/.zshrc:
alias jf="jsonf format"
alias jm="jsonf minify"
alias jv="jsonf validate"然后就可以:
jf # 格式化剪贴板中的JSON
jm # 压缩
jv # 验证# 格式化curl结果
curl https://api.github.com/users/rust-lang | jf
# 查看Docker inspect结果
docker inspect container_id | jf
# 格式化git配置
cat .git/config | jf我现在的JSON处理流程:
jf → 格式化快到飞起!
做完这个工具,你真的会每天用它。 这就是学编程的意义:解决实际问题,提高工作效率。
Rust让我们能写出这样的工具:安全、快速、跨平台。继续探索Rust,你会发现更多可能性。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。