2015-10-21 107 views
10

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

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

现在,如果我们假设在上述数据是在变量“输入”和下面的一段代码:

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

...应该结构Data看起来像什么?

回答

12

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

#[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<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 
} 

This问题也关系到重命名字段。

+1

拉取请求以记录此:https://github.com/serde-rs/json/pull/15 – vegai