【问题标题】:How to access field from strict serde_json deserialization with tags如何使用标签从严格的 serde_json 反序列化访问字段
【发布时间】:2021-04-22 15:36:48
【问题描述】:

我在data 的地址字段中得到Some(Address{...}),这是预期的。我可以从调试打印输出中看到它。

但是&data.Address = &data.Address.unwrap();

给我静态错误说:“没有字段Address on type Profile”。

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) 我可以解开价值 BUt 我想更新 &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"),
    }

【问题讨论】:

  • 你需要匹配Profile::Data或Profile::Data2才能访问里面的数据。

标签: rust


【解决方案1】:

编辑:

如果字段重叠,则无需创建 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 中工作的代码示例。

【讨论】:

  • Ty,但在你答案的第一部分:“serde_json::from_str”我收到一个错误“所需的类型注释无法推断函数 T 在函数 from_str 上声明的类型参数的类型”
  • 您可以像这样键入通用函数:serde_json::from_str&lt;Profile&gt;(json_string).unwrap()
  • 啊,是的,``` serde_json::from_str::(json_string).unwrap()``` 有效。但是后来我在冒号“ data1:Profile ...”处遇到了另一个错误。错误:“应为 =&gt;、@、if 或 | 之一,但发现 :”
  • 抱歉,在 Rust 中进行模式匹配时,这显然是无效的语法。我已经用 Rust Playground 中运行的示例更新了我的答案。
  • Ty,我从一开始就想做的是设置一个值。但设置后出现错误。 play.rust-lang.org/…
猜你喜欢
  • 1970-01-01
  • 2019-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多