【问题标题】:How to deserialize nested struct in Rust?如何在 Rust 中反序列化嵌套结构?
【发布时间】:2022-12-21 22:05:15
【问题描述】:

假设应读取以下 yaml/json:

scjson:
  - StateMachine:
      id: "sm_1"
  - StateMachine:
      id: "sm_2"

换句话说:一个 StateMachine 数组,每个 StateMachine 都有一个字符串类型的字段“id”。

我如何用 serde 反序列化它? 我试过:

#[derive(Clone, PartialEq, Debug, Deserialize, Serialize)]
pub struct StateMachine {
    id: String,
}

#[derive(Clone, PartialEq, Debug, Deserialize, Serialize)]
pub struct Scjson {
    scjson: Vec<StateMachine>,
}

但 id 永远不会被反序列化。

【问题讨论】:

    标签: rust serde-json


    【解决方案1】:

    要在 Rust 中反序列化嵌套结构,您可以使用像 serde 这样的库。 serde 是一个流行的库,用于序列化和反序列化 Rust 数据结构。

    以下是如何使用 serde 反序列化嵌套结构的示例:

    extern crate serde;
    #[macro_use]
    extern crate serde_derive;
    extern crate serde_json;
    
    #[derive(Serialize, Deserialize)]
    struct Inner {
        a: i32,
        b: i32,
    }
    
    #[derive(Serialize, Deserialize)]
    struct Outer {
        inner: Inner,
    }
    
    fn main() {
        let json = r#"{"inner":{"a":1,"b":2}}"#;
        let outer: Outer = serde_json::from_str(json).unwrap();
    
        println!("{:?}", outer);
    }
    extern crate serde;
    #[macro_use]
    extern crate serde_derive;
    extern crate serde_json;
    
    #[derive(Serialize, Deserialize)]
    struct Inner {
        a: i32,
        b: i32,
    }
    
    #[derive(Serialize, Deserialize)]
    struct Outer {
        inner: Inner,
    }
    
    fn main() {
        let json = r#"{"inner":{"a":1,"b":2}}"#;
        let outer: Outer = serde_json::from_str(json).unwrap();
    
        println!("{:?}", outer);
    }
    

    在此示例中,Outer 结构有一个名为 inner 的字段,它是一个 Inner 结构。 Inner 结构有两个字段 a 和 b,它们都是整数。

    要反序列化结构,我们首先需要使用 serde_json 提供的 from_str 函数解析 JSON 字符串。这个函数返回一个Result对象,所以我们需要使用unwrap方法来获取实际值。

    最后,我们可以打印外部对象以查看反序列化数据。这应该打印 Outer { inner: Inner { a: 1, b: 2 } }。

    您还可以在结构上使用 #[derive(Serialize, Deserialize)] 注释来自动为您的结构实现序列化和反序列化特征。这允许您直接在结构上使用 serde_json::from_str 函数。

    我希望这有帮助!如果您有任何问题,请告诉我。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-21
      • 1970-01-01
      • 1970-01-01
      • 2019-08-03
      • 1970-01-01
      相关资源
      最近更新 更多