gpt4 book ai didi

rust - 有没有办法让 serde_json 严格反序列化?

转载 作者:行者123 更新时间:2023-12-03 11:29:05 28 4
gpt4 key购买 nike

我的意思是,如果 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);
}
}

Playground

它总是成功 A ,但我希望它失败,因为它有额外的数据,所以它下降到 B (它匹配exaclty)。这只是我遇到的问题的一个例子。

最佳答案

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 }

( Permalink to the playground )

关于rust - 有没有办法让 serde_json 严格反序列化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60489085/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com