如何在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
相关产品推荐
相关产品推荐

