3

つまり、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これは私が抱えている問題のほんの一例です。

4

1 に答える 1

5

Serde には、この種の動作を構成するための多くの属性があります。

それらの1つは、#[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 }

(遊び場へのパーマリンク)

于 2020-03-02T12:53:38.383 に答える