Crate json_with_comments
source ·Expand description
JSON with comments parser for Rust. See documents also.
§Usage
in Cargo.toml
[dependencies]
json-with-comments = { git = "https://github.com/hayas1/json-with-comments" }
§Parse JSONC as typed struct
Any type that implements serde::Deserialize
can be deserialized from JSONC text.
use serde::Deserialize;
#[derive(Deserialize)]
struct Person<'a> {
name: &'a str,
address: Address<'a>,
}
#[derive(Deserialize)]
struct Address<'a> {
street: &'a str,
number: u32,
}
let json = r#"{
"name": "John Doe", // John Doe is a fictional character
"address": {
"street": "Main",
"number": 42, /* trailing comma */
},
}"#;
let data: Person = json_with_comments::from_str(json).unwrap();
assert!(matches!(
data,
Person {
name: "John Doe",
address: Address { street: "Main", number: 42 }
}
));
§Parse JSONC as any value
Any valid JSONC text can be parsed as Value
.
See jsonc!
macro also.
use json_with_comments::{from_str, Value, jsonc};
let json = r#"{
"name": "John Doe", // John Doe is a fictional character
"address": {
"street": "Main",
"number": 42, /* trailing comma */
},
}"#;
let data: Value = from_str(json).unwrap();
assert_eq!(data["name"], Value::String("John Doe".into()));
assert_eq!(data["address"]["street"], Value::String("Main".into()));
assert_eq!(data.query("address.number"), Some(&42.into()));
assert_eq!(data, jsonc!({ "name": "John Doe", "address": { "street": "Main", "number": 42 }}));
§Format struct as JSONC text
Any type that implements serde::Serialize
can be serialized into JSONC text.
use serde::Serialize;
#[derive(Serialize)]
struct Person<'a> {
name: &'a str,
address: Address<'a>,
}
#[derive(Serialize)]
struct Address<'a> {
street: &'a str,
number: u32,
}
let person = Person {
name: "John Doe",
address: Address {
street: "Main",
number: 42,
},
};
let minify = r#"{"name":"John Doe","address":{"street":"Main","number":42}}"#;
assert_eq!(json_with_comments::to_string(&person).unwrap(), minify);
let pretty = r#"{
"name": "John Doe",
"address": {
"street": "Main",
"number": 42,
},
}"#;
assert_eq!(json_with_comments::to_string_pretty(&person).unwrap(), pretty);
§Interconversion of serde_json::Value
and json_with_comments::Value
Any type of T
implements serde::Serialize
and serde::Deserialize
can be
serialized to and deserialized from serde_json::Value
, and json_with_comments::Value
also.
use serde::{Deserialize, Serialize};
use serde_json::json;
use json_with_comments::jsonc;
let (json, jsonc) = (json!({"name": "John Doe","age": 30}), jsonc!({ "name": "John Doe", "age": 30 }));
// serde_json::Value -> json_with_comments::Value
assert_eq!(json_with_comments::to_value(&json).unwrap(), jsonc);
assert_eq!(serde_json::from_value::<json_with_comments::Value>(json.clone()).unwrap(), jsonc);
// json_with_comments::Value -> serde_json::Value
assert_eq!(json_with_comments::from_value::<serde_json::Value>(&jsonc).unwrap(), json);
assert_eq!(serde_json::to_value(jsonc.clone()).unwrap(), json);
§Testing
Coverage can be checked https://hayas1.github.io/json-with-comments/tarpaulin-report
§Performance
// TODO
Re-exports§
pub use de::from_file;
pub use de::from_path;
pub use de::from_read;
pub use de::from_str;
pub use de::from_str_raw;
pub use de::from_value;
pub use error::JsonWithCommentsError as Error;
pub use error::Result;
pub use ser::to_file;
pub use ser::to_file_pretty;
pub use ser::to_path;
pub use ser::to_path_pretty;
pub use ser::to_string;
pub use ser::to_string_pretty;
pub use ser::to_value;
pub use ser::to_write;
Modules§
Macros§
- Construct a
crate::Value
from rust value. - Construct a
crate::value::JsoncValue
from rust value. If use without generics, seejsonc!
also.
Type Aliases§
Value
is type alias forvalue::JsoncValue<i64, f64>
.