我试图使用serde_json crate将JSON反序列化为Rust中的 struct .一个JSON条目示例:

{
    "name": "example",
    "stuff": [
        "item 1",
        "item 2",
        [
            "nested item 1",
            "nested item 2",
            "nested item 3"
        ]
    ]
}

"Stuff"字段包含一个元素数组,该元素数组可以是字符串,也可以是字符串array.我正在try 将这种数据反序列化为Struct.

我try 使用下面的Enum和Struct组合来简化serde_json.from_str():

#[derive(Debug, Serialize, Deserialize, Clone)]
#[serde(untagged)]
enum ListOrNestedList {
    List(Vec<String>),
    NestedList(Vec<Vec<String>>),
}

#[derive(Debug, Serialize, Deserialize, Clone)]
struct Entry {
    name: String,
    stuff: ListOrNestedList,
}

try 将此重新设置会产生以下异常:

called `Result::unwrap()` on an `Err` value: Error("data did not match any variant of untagged enum ListOrNestedList", line: 123, column: 40)

基于文档,使用Enum是处理包含不同类型的JSON的一种可能方法.然而,在我的示例中,两种可能的类型都包含在"stuff"字段中.是否需要一种不同的方法来简化这些数据,或者我只是犯了一个错误?

推荐答案

你把枚举值放错了.

[
        "item 1",
        "item 2",
        [
            "nested item 1",
            "nested item 2",
            "nested item 3"
        ]
    ]

不是"列表或嵌套列表",因为它包含字符串和字符串at the same time的向量.一个"列表或嵌套列表"可以是所有的一个或所有其他.

你需要解析的是:

#[derive(Debug, Serialize, Deserialize, Clone)]
#[serde(untagged)]
enum StringOrVec {
    String(String),
    Vec(Vec<String>),
}

#[derive(Debug, Serialize, Deserialize, Clone)]
struct Entry {
    name: String,
    stuff: Vec<StringOrVec>,
}

https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=e74b0152bad114743d18ae2c6141aa58

Rust相关问答推荐

即使参数和结果具有相同类型,fn的TypId也会不同

如何在tauri—leptos应用程序中监听后端值的变化?""

关联类型(类型参数)命名约定

如何装箱生命周期相关联的两个对象?

有没有办法模仿对象安全克隆?

如何导入crate-type=[";cdylib;]库?

铁 rust 中的泛型:不能将`<;T作为添加>;::Output`除以`{Float}`

无法定义名为&new&的关联函数,该函数的第一个参数不是self

将一个泛型类型转换为另一个泛型类型

确保参数是编译时定义的字符串文字

&'a T 是否意味着 T: 'a?

如何对一个特征的两个实现进行单元测试?

write_buffer 不写入缓冲区而是输出零 WGPU

Rust 中 Mutex<> 的深拷贝?

仅当函数写为闭包时才会出现生命周期错误

改变不实现克隆的 dioxus UseState struct

如何在 Rust 中创建最后一个元素是可变长度数组的 struct ?

Cargo:如何将整个目录或文件包含在功能标志中?

在 Rust 中枚举字符串的最佳方式? (字符()与 as_bytes())

在同一向量 Rust 中用另一个字符串扩展一个字符串