Giter VIP home page Giter VIP logo

serde_json5's Introduction

serde_json5's People

Contributors

acanthite1855 avatar anp avatar callum-oakley avatar erickt avatar gebressler avatar vdonich avatar woody77 avatar xamgore avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

serde_json5's Issues

Match signature of `serde_*::from_reader`

serde_json::from_reader has the following signature:

pub fn from_reader<R, T>(rdr: R) -> Result<T>
where
    R: Read,
    T: DeserializeOwned,

This matches the signature of serde_yaml::from_reader:

pub fn from_reader<R, T>(rdr: R) -> Result<T, Error>
where
    R: Read,
    T: DeserializeOwned,

Since this appears to be something of a de facto convention, serde_json5 should follow it. However, serde_json5::from_reader has the following signature:

pub fn from_reader<T, R>(reader: &mut R) -> Result<T>
where
    T: DeserializeOwned,
    R: Read,

This is “backwards”, and also needlessly prevents passing the reader by value (which means it has to be declared mut even if you intend for from_reader to consume it). serde_json5 should adopt the more standard signature.

enum variant deserialization doesn't match serde_json

serde_json5 will deserialize variant_name: {} into a unit-type variant.

An example

        #[derive(Debug, Clone, Deserialize, Serialize, PartialEq)]
        #[serde(rename_all="snake_case")]
        enum SomeEnum{
            VariantA(String),
            VariantB,
        }

        #[derive(Debug, Clone, Deserialize, Serialize)]
        struct SomeStruct {
            some_enum: SomeEnum
        }

        // This (correctly) passes.
        let json5 = r#"{some_enum: "variant_b" }"#;
        let parsed: SomeStruct = serde_json5::from_str(json5).unwrap();
        assert_eq!(parsed.some_enum, SomeEnum::VariantB);

        // This (incorrectly) passes
        let json5 = r#"{some_enum: { "variant_b": {} }}"#;
        let parsed: SomeStruct = serde_json5::from_str(json5).unwrap();
        assert_eq!(parsed.some_enum, SomeEnum::VariantB);

In the above example, if the json5 is bounced through a serde_json::Value, and that is deserialized into a struct, an error is thrown:

let json5 = r#"{some_enum: { "variant_b": {} }}"#;
let value: serde_json::Value = serde_json5::from_str(json5).unwrap();
let parsed: SomeStruct = serde_json::from_value(value).unwrap();  // fails with an error
assert_eq!(parsed.some_enum, SomeEnum::VariantB);

The error is: invalid type: map, expected unit

Specified number deserialization wrong

I came across this by accident:

fn test() {
        let test_str = r#"{"num": 1713749402391424255}"#;

        let parsed_by_serde_json5: HashMap<String, i64> = serde_json5::from_str(test_str).unwrap();
        let parsed_by_serde_json: HashMap<String, i64> = serde_json::from_str(test_str).unwrap();

        let parsed_by_serde_json5 = dbg!(parsed_by_serde_json5.get("num").unwrap());
        let parsed_by_serde_json = dbg!(parsed_by_serde_json.get("num").unwrap());

        assert_eq!(parsed_by_serde_json5, &1713749402391424255);
        assert_eq!(parsed_by_serde_json, &1713749402391424255);
}

Above is a code snippet deserializing 1713749402391424255 into i64, and as it runs, it panicked because of assertion error:

running 1 test
[src/parse.rs:190:37] parsed_by_serde_json5.get("num").unwrap() = 1713749402391424256
[src/parse.rs:191:36] parsed_by_serde_json.get("num").unwrap() = 1713749402391424255
thread 'parse::test::test_very_big_number' panicked at src/parse.rs:193:9:
assertion `left == right` failed
  left: 1713749402391424256
 right: 1713749402391424255
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
test parse::test::test_very_big_number ... FAILED

Here is the version and my environment:

$ cargo tree | grep -E "serde_json5*"           
└── serde_json5 v0.2.0 (https://github.com/google/serde_json5.git?branch=master#788a2cf8)
└── serde_json v1.0.116

$ rustup default                     
stable-aarch64-apple-darwin (default)

$ rustc --version       
rustc 1.77.0 (aedd173a2 2024-03-17)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.