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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 12:53:31