cloudwego / sonic-rs

A fast Rust JSON library based on SIMD.
https://crates.io/crates/sonic-rs
Apache License 2.0
488 stars 32 forks source link

`#[serde(flatten)]` breaks deserialization #114

Open kyle-mccarthy opened 2 months ago

kyle-mccarthy commented 2 months ago

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

liuq19 commented 2 months ago

thanks, we will investigate that

liuq19 commented 2 months ago

the problem is similar as https://github.com/serde-rs/serde/issues/1183 and https://github.com/serde-rs/json/issues/1099