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

Net*_*ave 3 rust serde serde-json

我的意思是,如果 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

操场

它总是成功A,但我希望它失败,因为它有额外的数据,因此它会落到B(与精确匹配的位置)。这只是我遇到的问题的一个例子。

mca*_*ton 5

Serde 有许多属性来配置这种行为。

其中之一就是#[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);
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

B { item_1: 10, item_2: 100, item_3: 1000 }
Run Code Online (Sandbox Code Playgroud)

固定链接到操场