提问人:John Graham 提问时间:11/13/2023 最后编辑:CaesarJohn Graham 更新时间:11/13/2023 访问量:65
serde_json识别此枚举表示形式?
Get serde_json to recognise this enum representation?
问:
我有可以使用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 使用它来知道它应该是哪一个,但是我所做的尝试(示例中注释掉的标签)由于各种原因不起作用。Type1
Type2
#[serde(untagged)]
object
data
有谁知道如何告诉 serde 它知道数据类型,但信息比它“上一级”?
(另见 serde 文档)
答:
4赞
Caesar
11/13/2023
#1
你差点就拥有了它:
- 不要使用
object
Item
flatten
data
到Item
#[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),
}
评论