面试题答案
一键面试- 代码实现:
首先,确保
Cargo.toml
文件中有serde
和serde_json
依赖:
然后编写如下代码:[dependencies] serde = { version = "1.0", features = ["derive"] } serde_json = "1.0"
use serde::{Deserialize}; #[derive(Deserialize)] struct Inner { value: String, } #[derive(Deserialize)] struct Outer { inner: Inner, flag: bool, } fn main() { let json_str = r#"{"inner": {"value": "test"}, "flag": true}"#; let result: Outer = serde_json::from_str(json_str).expect("Failed to deserialize"); println!("{:?}", result); }
- 可能遇到的问题及解决办法:
- JSON字段名与结构体字段名不匹配:
- 解决办法:使用
serde
的rename
属性。例如,如果JSON中的字段名是inner_value
,而结构体中是value
,可以这样修改Inner
结构体定义:
#[derive(Deserialize)] struct Inner { #[serde(rename = "inner_value")] value: String, }
- 解决办法:使用
- JSON数据类型与结构体字段类型不匹配:
- 解决办法:确保JSON中的数据类型与结构体字段定义的类型一致。例如,如果
flag
字段在JSON中是字符串而不是布尔值,反序列化会失败。在这种情况下,需要先对JSON数据进行预处理,或者在结构体字段上使用自定义的反序列化逻辑(通过实现Deserialize
trait)来处理这种不匹配。
- 解决办法:确保JSON中的数据类型与结构体字段定义的类型一致。例如,如果
- 缺少必需字段:
- 解决办法:如果JSON中缺少结构体中定义的必需字段,反序列化会失败。可以通过在结构体字段上使用
serde
的default
属性来指定默认值,这样即使JSON中没有该字段,也能成功反序列化。例如:
#[derive(Deserialize)] struct Outer { inner: Inner, #[serde(default)] flag: bool, }
- 解决办法:如果JSON中缺少结构体中定义的必需字段,反序列化会失败。可以通过在结构体字段上使用
flag
字段时,flag
会被初始化为false
(布尔类型的默认值)。 - JSON字段名与结构体字段名不匹配: