rust - 如何使用标签从严格的 serde_json 反序列化访问字段
问题描述
我进入了预期Some(Address{...})
的地址字段。data
我可以从调试打印输出中看到它。
但&data.Address = &data.Address.unwrap();
给我静态错误说:“类型配置文件中没有字段Address
”。
let mut data:Profile = serde_json::from_str(json_string).unwrap();
&data.Address = &data.Address.unwrap();
#[derive(Deserialize, Debug, Serialize)]
#[serde(tag = "m_tag")]
pub enum Profile {
Data{
#[serde(rename="FirstName")] // to comply with Rust coding standards
first_name:String,
LastName: String,
Age: u32,
Address: Option<Address>,
PhoneNumbers: Vec<String>
},
Data2{
#[serde(rename="FirstName")] // to comply with Rust coding standards
first_name:String,
LastName: String,
Age: u32,
},
}
#[derive(Serialize, Deserialize)]
struct Address {
Street: String,
City: String,
Country: String
}
更新:Q1)我可以解开值但我想更新 &data.Address 到它。但是我又回到了原始问题,其中 &data 是一种Profile
类型并且没有该Address
字段。
match &data {
Profile::Data {
first_name,
LastName,
Age,
Address,
PhoneNumbers,
} => data.Address = &Address.as_ref().unwrap(),
Profile::Data2 {
first_name,
LastName,
Age,
} => println!("ok"),
}
解决方案
编辑:
如果字段重叠,则无需创建 Enum。最好将不保证存在的字段声明为可选:
#[derive(Deserialize, Debug, Serialize)]
struct Profile {
#[serde(rename="FirstName")]
first_name:String,
LastName: String,
Age: u32,
Address: Option<Address>,
PhoneNumbers: Option<Vec<String>>
};
所以现在可以保证该类型Profile
有一个Address
字段:
let data:Profile = serde_json::from_str(json_string).unwrap();
println!("{:?}", data.Address);
这是一个在Rust Playground中工作的代码示例。
推荐阅读
- python - PySpark Dataframe pickle 异常:构造 ClassDict 的预期零参数(对于 pyspark.ml.linalg.DenseVector)
- typescript - WebStorm IDE 对 Vue 3 Composition API 的支持真的很差,还是我的配置搞砸了?
- python - 如何绘制每日最大值
- vue.js - Vue3基于父级传递的异步prop获取数据的最佳方法
- javascript - 在 mousemove 上更改与其中心相关的按钮位置
- r - (堆叠)在 facet_grid 内分组的条形图
- java - 如何在 Java SE 的 MainForm 容器中打开客户 fxml 文件?
- c# - How can I get the next date from a list of DayOfWeek?
- join - Gremlin,组合两个查询并连接数据
- javascript - 使用 nightwatchjs 标签时 ssh2 测试未关闭