【问题标题】:Rust serde parse Vec of substructRust serde 解析子结构的 Vec
【发布时间】:2021-07-12 04:44:11
【问题描述】:

是否可以只提取此 json items 数组的 Message 结构?
如果项目中有多个条目,我的目标是获取消息的 Vec。

{
  "items": [
    {
      "Message": {
        "data": "data",
        "header": "header"
      },
      "structx": {
        "val": 1
      },
      "val1": "test"
    }
  ]
}

到目前为止,我有这些结构可以反序列化上述内容。

#[derive(Debug, Deserialize, Serialize)]
struct Items {
    items: Vec<Message>,
}

#[derive(Debug, Deserialize, Serialize)]
struct Message {
    #[serde(rename = "Message")]
    msg: Payload,
}

#[derive(Debug, Deserialize, Serialize)]
struct Payload {
    header: String,
    data: String,
}

我是这样反序列化的:

let x = json_string; // the above json
let msg: Items = serde_json::from_str(&x)?;

这可行,但也许它可以变得更清洁。 我想到了这样的事情(不起作用),这样我就可以删除不必要的结构(项目,消息):

let msg: Vec<Payload> = serde_json::from_str(&x)?;

【问题讨论】:

    标签: json serialization rust flatten serde


    【解决方案1】:

    有3个解决方案:

    1. 处理它
    2. 实现自定义Deserialize
    3. 使用不安全和#[repr(transparent)]:
    use serde::{Deserialize, Serialize};
    
    #[derive(Debug, Deserialize, Serialize)]
    #[repr(transparent)]
    struct Items {
        items: Vec<Message>,
    }
    
    #[derive(Debug, Deserialize, Serialize)]
    #[repr(transparent)]
    struct Message {
        #[serde(rename = "Message")]
        msg: Payload,
    }
    
    #[derive(Debug, PartialEq, Deserialize, Serialize)]
    struct Payload {
        header: String,
        data: String,
    }
    
    fn main() {
        let raw = r#"{
        "items": [{
            "Message": {
                "data": "data",
                "header": "header"
            },
            "structx": {
                "val": 1
            },
            "val1": "test"
        }]
    }"#;
    
        let msg: Items = serde_json::from_str(&raw).unwrap();
        let payloads: Vec<Payload> = unsafe { std::mem::transmute(msg) };
    
        assert_eq!(
            payloads,
            vec![Payload {
                data: String::from("data"),
                header: String::from("header")
            }]
        );
    }
    

    【讨论】:

      猜你喜欢
      • 2022-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-11
      • 1970-01-01
      • 2022-11-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多