【问题标题】:Pretty print JSON without linebreaks with serde?使用 serde 打印没有换行符的漂亮 JSON?
【发布时间】:2019-12-11 03:37:54
【问题描述】:
我想使用 Rust 的 serde crate 漂亮地打印一些 JSON。使用serde_json::to_string 我可以得到这个:
{"foo":1,"bar":2}
如果我切换到serde_json::to_string_pretty,我会得到:
{
"foo": 1,
"bar": 2
}
但是,我希望在中间加上空格以使其更容易看,但没有换行符,所以它保持在一行:
{"foo": 1, "bar": 2}
我怎样才能做到这一点?请注意,被字符串化的实际 JSON 可能更复杂,包含未知级别的嵌套。所以仅仅漂亮的打印然后去掉换行符是行不通的。
【问题讨论】:
标签:
json
rust
pretty-print
serde
【解决方案1】:
在后台,to_string_pretty 使用内置的 PrettyFormatter 调用 Serializer::with_formatter。
您的选择是:
- 创建
Formatter 的自定义实现,以您想要的格式输出JSON。复制和粘贴PrettyFormatter 可能是一个好的开始!
- 修改
PrettyFormatter 以提供此选项并提交拉取请求。它已经允许您自定义用于缩进的字符串,所以我不认为允许删除换行符会很费劲!
【解决方案2】:
不幸的是,serde_json 没有足够的选项以简洁的方式执行此操作。一个简单的选择是使用正则表达式:
在您的Cargo.toml 文件中:
regex = "1.5.4"
在你的 Rust 源代码文件中:
use regex::Regex;
use serde_json::{to_string_pretty, Value};
[...]
let json_object: Value = [...];
let single_line_pretty_data = Regex::new("\n *").unwrap().replace_all(&
Regex::new("([,:])\n *").unwrap().replace_all(&
to_string_pretty(&json_object).unwrap(), "$1 ").into_owned(),
"").into_owned();