Rust 和 Serde JSON 反序列化示例?

Posted

技术标签:

【中文标题】Rust 和 Serde JSON 反序列化示例?【英文标题】:Rust & Serde JSON deserialization examples? 【发布时间】:2015-10-21 05:51:43 【问题描述】:

我正在尝试弄清楚如何使用 Serde 将 JSON 反序列化为结构。例如,serde_json 的 own documentation 上的示例 JSON 包含以下数据:


    "FirstName": "John",
    "LastName": "Doe",
    "Age": 43,
    "Address": 
        "Street": "Downing Street 10",
        "City": "London",
        "Country": "Great Britain"
    ,
    "PhoneNumbers": [
        "+44 1234567",
        "+44 2345678"
    ]

现在,如果我们假设上面的数据在一个变量“input”和下面的代码中:

let deserialized_data: Data = serde_json::from_str(input).unwrap();

... struct Data 应该是什么样的?

【问题讨论】:

【参考方案1】:

大多数标准数据结构都是可序列化的,因此以下结构应该可以工作:

#[derive(Serialize, Deserialize)]
struct Data 
    FirstName: String,
    LastName: String,
    Age: u32,
    Address: Address,
    PhoneNumbers: Vec<String>


#[derive(Serialize, Deserialize)]
struct Address 
    Street: String,
    City: String,
    Country: String

如果输入中的某些字段可能不存在,则对应的结构字段应为Option&lt;T&gt; 而不仅仅是T

请注意,可以以更“生锈”的方式命名字段,即snake_case,因为 serde 支持重命名注释:

#[derive(Serialize, Deserialize)]
struct Address 
    #[serde(rename="Street")]
    street: String,
    #[serde(rename="City")]
    city: String,
    #[serde(rename="Country")]
    country: String

This 问题也与字段重命名有关。

【讨论】:

以上是关于Rust 和 Serde JSON 反序列化示例?的主要内容,如果未能解决你的问题,请参考以下文章

反序列化嵌套 JSON 结构时,Serde 返回 SyntaxError “预期值”

如何为计时时间戳使用自定义 serde 反序列化器?

使用 serde Rust 将数据从记录转置到没有中间结构的列

rust使用json

我如何懒惰地从Rust中的文件/流中读取多个JSON值?

如何将多个键值条目的 JSON 对象反序列化为 Rust 中的自定义结构