Rust中如何正确解析带Unicode转义序列的JSON并得到目标格式字符串
问题解决方法
- 首先避免对解析得到的字符串值重复执行serde_json序列化:你通过
serde_json::from_slice解析JSON后,\u001f已经被正确解析为Unicode控制字符U+001F,再调用serde_json::to_vec会把控制字符重新按照JSON规范转义为\u001f,这是你得到不符合预期结果的核心原因。 - 直接从
serde_json::Value中取出原生字符串,再对字符串中的字符做格式化转义,输出Rust风格的\u{xx}表示即可。
use serde_json::Value; use std::fmt::Write; fn main() { let input = r#"{"a": "b\u001fc"}"#; let json: Value = serde_json::from_slice(input.as_bytes()).unwrap(); // 直接取出解析后的原生字符串 let raw_str = json.get("a").and_then(Value::as_str).unwrap(); // 格式化得到Rust风格的Unicode转义字符串 let mut result = String::new(); for c in raw_str.chars() { match c { // 可打印ASCII字符直接输出 ' '..='~' => result.push(c), // 非打印字符转成\u{xx}格式 _ => write!(&mut result, "\\u{{{:x}}}", c as u32).unwrap() } } println!("{}", result); // 输出:b\u{1f}c }
如果需要处理更复杂的转义场景,调整match分支的匹配规则即可满足需求。
内容的提问来源于stack exchange,提问作者Marko Seidenglanz
相关产品推荐
相关产品推荐

