如何在Rust中还原多次转义的字符串并解析为结构体?
解决多次转义JSON字符串解析为结构体的问题
你的dirty_string是双重转义的结果:它本身是一个被双引号包裹的JSON字符串值,内部内容又是经过转义的合法JSON。直接全局替换反斜杠会破坏结构,导致解析失败。以下是两种可靠的解决方法:
方法一:利用serde分层解析(推荐)
先把外层的转义字符串解析为原始字符串,再将这个字符串解析为目标结构体,完全避免手动处理转义的风险:
use serde::{Deserialize, Serialize}; #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] struct Parsed { key1: String, key2: String } fn main() { let dirty_string = r#"\"{\\\"key1\\\":\\\"val1\\\",\\\"key2\\\":\\\"val2\\\"}\""#; // 第一步:解析得到内层的转义JSON字符串 let inner_escaped_json: String = serde_json::from_str(dirty_string).unwrap(); // 此时inner_escaped_json的值为 "{\"key1\":\"val1\",\"key2\":\"val2\"}" // 第二步:将内层字符串解析为目标结构体 let to_struct: Parsed = serde_json::from_str(&inner_escaped_json).unwrap(); dbg!(to_struct); }
方法二:手动处理转义(适合理解原理)
先去掉外层包裹的双引号,再把所有双重反斜杠替换为单个反斜杠,得到合法JSON:
use serde::{Deserialize, Serialize}; #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] struct Parsed { key1: String, key2: String } fn main() { let dirty_string = r#"\"{\\\"key1\\\":\\\"val1\\\",\\\"key2\\\":\\\"val2\\\"}\""#; // 移除首尾的双引号 let without_outer_quotes = dirty_string.trim_matches('"'); // 将双重反斜杠替换为单个反斜杠 let valid_json = without_outer_quotes.replace("\\\\", "\\"); let to_struct: Parsed = serde_json::from_str(&valid_json).unwrap(); dbg!(to_struct); }
为什么之前的尝试失败?
你用replace("\\", "")得到的结果是"\"{\"key1\":\"val1\",\"key2\":\"val2\"}\"",这个字符串的实际内容是{"key1":"val1","key2":"val2"}但被外层双引号包裹,serde会将整个内容识别为字符串类型,而非预期的结构体,因此抛出invalid type: string "{", expected struct Parsed的错误。
内容的提问来源于stack exchange,提问作者Finlay Weber
相关产品推荐
相关产品推荐

