serde_json能否将JSON字段名映射为不同的Rust结构体字段名?
serde_json 不同名字段映射实现方法
完全可以,serde_json 依托 serde 原生的派生宏属性就能实现JSON属性名和Rust结构体字段名的自定义映射,不需要手写解析逻辑。
针对你给出的示例,只需要在结构体的对应字段上添加#[serde(rename = "json字段实际名称")]标记即可,完整代码写法如下:
use serde::Deserialize; // 派生反序列化宏 #[derive(Deserialize)] struct StructName { // 指定该字段对应JSON里的json_name属性 #[serde(rename = "json_name")] struct_name: i32 }
用上述定义的结构体解析你给出的JSON内容:
{ "json_name": 3 }
就能直接得到值为StructName { struct_name: 3 }的结构体实例,完全匹配需求。
补充实用规则
- 如果整个结构体的字段和JSON字段都遵循固定的命名风格差异(比如JSON统一用蛇形命名、Rust结构体统一用驼峰命名),不需要给每个字段单独加rename标记,直接在结构体定义上方添加全局命名转换规则即可,例如:
目前支持的自动转换规则包括#[derive(Deserialize, Serialize)] #[serde(rename_all = "snake_case")] // 所有字段自动映射为蛇形命名的JSON属性 struct Example { first_field: i32, second_field: String }camelCase、snake_case、PascalCase、SCREAMING_SNAKE_CASE、kebab-case等常见命名格式。 rename属性的映射是双向生效的:反序列化时会把指定名称的JSON字段解析到对应结构体字段,序列化时也会把结构体字段输出为你指定名称的JSON属性。
内容的提问来源于stack exchange,提问作者Test
相关产品推荐
相关产品推荐

