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

如何在Rust中反序列化包含JSON字符串的字段?

嵌套JSON字符串的Rust反序列化实现

要实现将外层JSON里的input字段(JSON格式字符串)直接反序列化为InputType结构体,借助serde库的自定义反序列化能力即可完成,步骤如下:

1. 添加依赖

确保Cargo.toml中包含serde及serde_json并开启必要特性:

[dependencies]
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"

2. 定义结构体并配置反序列化规则

注意type是Rust保留关键字,需要用#[serde(rename = "type")]映射JSON字段;同时为Input的input字段指定自定义反序列化逻辑,实现JSON字符串到结构体的转换:

use serde::Deserialize;
use serde_json::Error as JsonError;

// 自定义反序列化函数:将JSON字符串解析为目标结构体
fn deserialize_json_string<'de, D, T>(deserializer: D) -> Result<T, D::Error>
where
    D: serde::Deserializer<'de>,
    T: serde::Deserialize<'de>,
{
    let s = String::deserialize(deserializer)?;
    serde_json::from_str(&s).map_err(serde::de::Error::custom)
}

#[derive(Debug, Deserialize)]
pub struct InputType {
    #[serde(rename = "type")]
    pub r#type: String, // 用r#type避开Rust关键字
    pub name: String,
}

#[derive(Debug, Deserialize)]
pub struct Input {
    #[serde(deserialize_with = "deserialize_json_string")]
    pub input: InputType,
}

3. 测试反序列化逻辑

用你提供的JSON请求体验证:

fn main() -> Result<(), JsonError> {
    let json = r#"{
        "input": "{\"type\":\"id\",\"name\":\"DNI\"}"
    }"#;
    
    let input: Input = serde_json::from_str(json)?;
    println!("{:#?}", input);
    // 输出示例:
    // Input {
    //     input: InputType {
    //         r#type: "id",
    //         name: "DNI"
    //     }
    // }
    Ok(())
}

关键说明

  • r#type是Rust中处理关键字作为标识符的语法,配合#[serde(rename = "type")]可正确映射JSON中的type字段。
  • deserialize_json_string函数先将输入反序列化为字符串,再通过serde_json::from_str将字符串解析为InputType,实现嵌套JSON的自动解析。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 03:10:59