sonic-rs icon indicating copy to clipboard operation
sonic-rs copied to clipboard

`#[serde(flatten)]` breaks deserialization

Open kyle-mccarthy opened this issue 5 months ago • 2 comments

Describe the bug

If a struct contains a field annotated with #[serde(flatten)], it cannot be deserialized by sonic.

To Reproduce

Cargo.toml

[package]
name = "repro"
version = "0.1.0"
edition = "2021"


[dependencies]
sonic-rs = "0.3.13"
serde = { version = "1.0", features = ["derive"] }

main.rs

fn main() {
    #[derive(serde::Deserialize)]
    struct Repro {
        expected_field: i32,
        #[serde(flatten)]
        others: std::collections::HashMap<String, sonic_rs::Value>,
    }

    let json = r#"
    {
        "expected_field": 1,
        "unexpected_field": 2
    }
    "#;

    let _repro: Repro = sonic_rs::from_str(json).unwrap();
}

Expected behavior

Deserialization to succeed and for others to contain the "unexpected_field".

Actual behavior

thread 'main' panicked at src/main.rs:16:50: called Result::unwrap() on an Err value: invalid type: newtype struct, expected a valid json at line 5 column 4

sonic-rs version:

latest (0.3.13)

Environment:

macos

kyle-mccarthy avatar Sep 25 '24 03:09 kyle-mccarthy