Rust中BTreeMap/HashMap的终端格式化显示问题
解决Rust中Map存储JSON字符串后打印带转义的问题
核心问题在于你存的是格式化后的JSON字符串,而非结构化的JSON数据。用{:?}打印Map时,Debug格式会输出字符串的原始字符(包括换行、转义引号),导致显示杂乱。以下两种方法可实现你想要的结构化输出:
方法一:存储结构化JSON值(推荐)
不要存字符串,把JSON解析成serde_json::Value类型存入Map,这样能直接对整个Map或单个值做美观格式化输出。
步骤:
- 添加依赖到
Cargo.toml:
[dependencies] serde = { version = "1.0", features = ["derive"] } serde_json = "1.0"
- 示例代码:
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
相关产品推荐
相关产品推荐

