A Rust library for serializing and deserializing JSON5 with Serde.
This project is a fork of callum-oakley/json5-rs.
License: Apache License 2.0
A Rust library for serializing and deserializing JSON5 with Serde.
This project is a fork of callum-oakley/json5-rs.
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.
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)
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
Is there a chance to have this published to crates.io?
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.