serde_json识别此枚举表示形式?

Get serde_json to recognise this enum representation?

提问人:John Graham 提问时间:11/13/2023 最后编辑:CaesarJohn Graham 更新时间:11/13/2023 访问量:65

问:

我有可以使用serde解析的JSON数据,基本上看起来像这样(大大简化了!

{
    "id": 1,
    "object": "Type1",
    "data": {
        "type_1_name": "value_1"
    }
}
{
    "id": 2,
    "object": "Type2",
    "data": {
        "type_2_name": "value_2"
    }
}

这是我用来解析它的代码:

#![allow(unused)]

use serde::Deserialize;
use serde_json::json;

#[derive(Deserialize)]
struct Item {
    id: u32,
    object: String,

    //#[serde(tag = "object")]
    data: Data,
}

#[derive(Deserialize)]
#[serde(untagged)]
//#[serde(tag = "object")]
//#[serde(tag = "object", content = "data")]
enum Data {
    Type1(Type1),
    Type2(Type2),
}

#[derive(Deserialize)]
struct Type1 {
    type_1_name: String,
}

#[derive(Deserialize)]
struct Type2 {
    type_2_name: String,
}

fn main() {
    let json = json!([
        {
            "id": 1,
            "object": "Type1",
            "data": {
                "type_1_name": "value_1"
            }
        },
        {
            "id": 2,
            "object": "Type2",
            "data": {
                "type_2_name": "value_2"
            }
        }
    ]);

    let _json: Vec<Item> = serde_json::from_value(json).unwrap();
}

另请参见 rust playground 中。

当我解析它时,我希望顶级数据结构是相同的类型(在示例中),因为它们具有共同的字段,并且这样迭代它们会很有用。Data

如果我使用 .但是,在大型数据集上,如果错误只是“不匹配”,则很难找到错误 - 我有一个字段告诉我该字段应该是什么类型,所以我希望我可以告诉 serde 使用它来知道它应该是哪一个,但是我所做的尝试(示例中注释掉的标签)由于各种原因不起作用。Type1Type2#[serde(untagged)]objectdata

有谁知道如何告诉 serde 它知道数据类型,但信息比它“上一级”?

(另见 serde 文档)

rust serde serde-json

评论

1赞 Peter Hall 11/13/2023
请您能否在问题中包含您的代码而不是外部链接。在这种情况下,只有类型和 serde 注释可能就足够了。

答:

4赞 Caesar 11/13/2023 #1

你差点就拥有了它:

  • 不要使用objectItem
  • flatten dataItem
#[derive(Deserialize, Debug)]
struct Item {
    id: u32,
    #[serde(flatten)]
    data: Data,
}

#[derive(Deserialize, Debug)]
#[serde(tag = "object", content = "data")]
enum Data {
    Type1(Type1),
    Type2(Type2),
}

操场