使用serde生成漂亮的(缩进的)JSON

66

使用serde_json crate,我可以使用

::serde_json::to_string(&obj)
将一个对象序列化为JSON字符串。生成的JSON采用紧凑的格式,例如:
{"foo":1,"bar":2}

但是我该如何生成漂亮/缩进的JSON呢?例如,我想要得到这样的结果:

{
  "foo": 1,
  "bar": 2
}
2个回答

88

serde_json::to_string_pretty 函数可以生成格式良好、缩进的 JSON。

use serde_json::json;

fn main() {
    let obj = json!({"foo":1,"bar":2});
    println!("{}", serde_json::to_string_pretty(&obj).unwrap());
}

这种方法默认使用2个缩进空格,正好符合您在问题中所要求的。您可以通过使用PrettyFormatter::with_indent自定义缩进。

use serde::Serialize;
use serde_json::json;

fn main() {
    let obj = json!({"foo":1,"bar":2});

    let mut buf = Vec::new();
    let formatter = serde_json::ser::PrettyFormatter::with_indent(b"    ");
    let mut ser = serde_json::Serializer::with_formatter(&mut buf, formatter);
    obj.serialize(&mut ser).unwrap();
    println!("{}", String::from_utf8(buf).unwrap());
}

1
我觉得 formatter::to_string(&obj)formatter::to_writer(w, &obj) 是 API 中缺失的一部分。 - BallpointBen

26

使用to_string_pretty函数可以得到缩进的JSON:

::serde_json::to_string_pretty(&obj)

5
有没有办法设置缩进?默认似乎是2个空格。 - pietrovismara

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接