【问题标题】: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();
    

    【讨论】:

      猜你喜欢
      • 2014-05-19
      • 2011-08-28
      • 2017-01-31
      • 1970-01-01
      • 2015-07-03
      相关资源
      最近更新 更多