我的意思是,如果2个对象在某些属性上重叠,是否有办法尝试匹配所有所有? 例如:
use serde::{Serialize, Deserialize};
use serde_json; // 1.0.47; // 1.0.104
#[derive(Serialize, Deserialize, Debug)]
pub struct A {
pub item_1: i32,
pub item_2: i32,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct B {
pub item_1: i32,
pub item_2: i32,
pub item_3: i32,
}
fn main() {
let json_data = r#"{"item_1" : 10, "item_2" : 100, "item_3" : 1000}"#;
if let Ok(data) = serde_json::from_str::<A>(json_data) {
println!("{:?}", data);
} else if let Ok(data) = serde_json::from_str::<B>(json_data) {
println!("{:?}", data);
}
}
它总是在A
上成功完成,但是我希望它失败,因为它具有额外的数据,因此落到了B
(与之匹配的地方)上。这只是我遇到的问题的一个例子。
答案 0 :(得分:3)
Serde有许多attributes来配置这种行为。
其中一个是#[serde(deny_unknown_fields)]
,它确实做到了:
use serde::{Deserialize, Serialize};
use serde_json; // 1.0.47; // 1.0.104
#[derive(Serialize, Deserialize, Debug)]
#[serde(deny_unknown_fields)]
pub struct A {
pub item_1: i32,
pub item_2: i32,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct B {
pub item_1: i32,
pub item_2: i32,
pub item_3: i32,
}
fn main() {
let json_data = r#"{"item_1" : 10, "item_2" : 100, "item_3" : 1000}"#;
if let Ok(data) = serde_json::from_str::<A>(json_data) {
println!("{:?}", data);
} else if let Ok(data) = serde_json::from_str::<B>(json_data) {
println!("{:?}", data);
}
}
输出:
B { item_1: 10, item_2: 100, item_3: 1000 }