You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rust中BTreeMap/HashMap的终端格式化显示问题

解决Rust中Map存储JSON字符串后打印带转义的问题

核心问题在于你存的是格式化后的JSON字符串,而非结构化的JSON数据。用{:?}打印Map时,Debug格式会输出字符串的原始字符(包括换行、转义引号),导致显示杂乱。以下两种方法可实现你想要的结构化输出:

方法一:存储结构化JSON值(推荐)

不要存字符串,把JSON解析成serde_json::Value类型存入Map,这样能直接对整个Map或单个值做美观格式化输出。

步骤:

  1. 添加依赖到Cargo.toml:
[dependencies]
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
  1. 示例代码:
use std::collections::BTreeMap;
use serde_json::{self, Value};

fn main() {
    let beautified_string = r#"{
  "a1": "nWM0MM",
  "b1": "YErSKv",
  "c1": "B",
  "d1": [
    "AIBAC",
    "AH8EA"
  ]
}"#;

    // 将JSON字符串解析为结构化的Value
    let json_value: Value = serde_json::from_str(beautified_string).unwrap();

    let mut map = BTreeMap::new();
    map.insert("a".to_string(), json_value);

    // 打印整个Map的美观JSON格式
    let pretty_output = serde_json::to_string_pretty(&map).unwrap();
    println!("{}", pretty_output);

    // 如果只想打印单个键值对(不带外层大括号)
    for (key, value) in &map {
        println!("\"{}\": {}", key, serde_json::to_string_pretty(value).unwrap());
    }
}

输出效果:

打印整个Map时:

{
  "a": {
    "a1": "nWM0MM",
    "b1": "YErSKv",
    "c1": "B",
    "d1": [
      "AIBAC",
      "AH8EA"
    ]
  }
}

打印单个键值对时(符合你想要的格式):

"a": {
  "a1": "nWM0MM",
  "b1": "YErSKv",
  "c1": "B",
  "d1": [
    "AIBAC",
    "AH8EA"
  ]
}

方法二:若必须存储字符串,打印时解析后格式化

如果因特殊需求必须在Map中存储JSON字符串,打印时可先把字符串解析回结构化JSON,再做美观输出:

use std::collections::BTreeMap;
use serde_json;

fn main() {
    let beautified_string = r#"{
  "a1": "nWM0MM",
  "b1": "YErSKv",
  "c1": "B",
  "d1": [
    "AIBAC",
    "AH8EA"
  ]
}"#;

    let mut map = BTreeMap::new();
    map.insert("a".to_string(), beautified_string.to_string());

    for (key, json_str) in &map {
        // 解析字符串为JSON值,再格式化输出
        let json_value = serde_json::from_str(json_str).unwrap();
        println!("\"{}\": {}", key, serde_json::to_string_pretty(&json_value).unwrap());
    }
}

原理说明:

  • {:?}是Debug打印,会完整显示字符串的原始内容(包括转义字符、换行符);
  • serde_json::to_string_pretty会把结构化的JSON数据转换成带缩进的美观字符串,直接用{}打印就能得到预期效果。

内容的提问来源于stack exchange,提问作者roku675

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 02:15:41