我试图弄清楚如何使用Serde将JSON反序列化为一个 struct .例如,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应该是什么样子?

推荐答案

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

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

如果输入中可能缺少一些字段,那么相应的 struct 字段应该是Option<T>,而不是T.

请注意,可以用更"生疏"的方式命名字段,即snake_大小写,因为serde支持重命名注释:

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

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

Rust相关问答推荐

为什么父作用域中的变量超出了子作用域

在‘await’点上使用‘std::同步::Mutex’是否总是会导致僵局?

Tauri tauri—apps/plugin—store + zustand

为什么我需要在这个代码示例中使用&

如何使用字符串迭代器执行查找?

如何将像烫手山芋一样不透明的值从一个Enum构造函数移动到下一个构造函数?

如何正确地将App handler传递给Tauri中的其他模块?

在析构赋值中使用一些现有绑定

如何创建一个可变的嵌套迭代器?

为什么Deref类特征不构成?

对于rustc编译的RISC-V32IM二进制文件,llvm objdump没有输出

是否可以在不直接重复的情况下为许多特定类型实现一个函数?

当锁被释放时,将锁包装到作用域中是否会发生变化?

缺失serde的字段无法设置为默认值

Rust 中的方法调用有什么区别?

判断 is_ok 后重用结果

实现不消费的迭代器

Rust 跨同一文件夹中文件的可见性

HashMap entry() 方法使borrow 的时间比预期的长

为什么我返回的 impl Trait 的生命周期限制在其输入的生命周期内?