Rust&Serde JSON反序列化示例?

veg*_*gai 16 json rust json-deserialization serde

我试图弄清楚如何使用Serde将JSON反序列化为结构.例如,serde_json 自己的文档中的示例JSON 包含以下数据:

{
    "FirstName": "John",
    "LastName": "Doe",
    "Age": 43,
    "Address": {
        "Street": "Downing Street 10",
        "City": "London",
        "Country": "Great Britain"
    },
    "PhoneNumbers": [
        "+44 1234567",
        "+44 2345678"
    ]
}
Run Code Online (Sandbox Code Playgroud)

现在,如果我们假设上面的数据是在变量"input"和下面的代码中:

let deserialized_data: Data = serde_json::from_str(input).unwrap();
Run Code Online (Sandbox Code Playgroud)

......结构应该是什么Data样的?

Vla*_*eev 19

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

#[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
}
Run Code Online (Sandbox Code Playgroud)

如果输入中的某些字段可能不存在,那么相应的结构字段应该Option<T>不仅仅是T.

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

#[derive(Serialize, Deserialize)]
struct Address {
    #[serde(rename="Street")]
    street: String,
    #[serde(rename="City")]
    city: String,
    #[serde(rename="Country")]
    country: String
}
Run Code Online (Sandbox Code Playgroud)

问题也与字段重命名有关.