2 releases

0.1.1 Jun 23, 2023
0.1.0 Jun 23, 2023

#2494 in Parser implementations

MIT license

18KB
204 lines

jsonc-to-json

CI Latest Version Docs License

Simple library for converting JSON with Comments into JSON, in short it removes the following:

  • Line comments, e.g. // Line Comment
  • Block comments, e.g. /* Block Comment */
  • Trailing commas, e.g. [1,2,3,,] -> [1,2,3]

Note: The implementation does not use a full-blown JSON with Comments parser. Instead it uses a JSON with Comments tokenizer, which makes conversion a lot faster.

Currently #![no_std] is not supported. It will however be added, when some upstream changes have been applied.

See jsonc_to_json() for more information.

Example

use jsonc_to_json::{jsonc_to_json, jsonc_to_json_into};

let jsonc = "{\"arr\": [1, 2,/* Comment */ 3, 4,,]}// Line Comment";

let json = jsonc_to_json(jsonc);
println!("{}", json);

// Alternatively, use `jsonc_to_json_into()` to reuse an
// already allocated `String`
let mut json = String::new();
jsonc_to_json_into(jsonc, &mut json);
println!("{}", json);

Both output the following:

{"arr": [1, 2, 3, 4]}

Serde Example

use jsonc_to_json::{jsonc_to_json, jsonc_to_json_into};
use serde::Deserialize;

#[derive(Deserialize, Debug)]
struct Data {
    arr: Vec<i32>,
}
let jsonc = "{\"arr\": [1, 2,/* Comment */ 3, 4,,]}// Line Comment";

let json = jsonc_to_json(jsonc);
let data: Data = serde_json::from_str(&json)?;

println!("{}", json);
println!("{:?}", data);

Which outputs the following:

{"arr": [1, 2, 3, 4]}
Data { arr: [1, 2, 3, 4] }

Non-Allocating & Zero-Copy Iterator Example

Non-allocating Iterator that yields string slices of valid JSON.

use jsonc_to_json::jsonc_to_json_iter;

let jsonc = r#"{foo}/**/[1,2,3,,]"bar""#;

let mut iter = jsonc_to_json_iter(jsonc);
assert_eq!(iter.next(), Some("{foo}")); // Line comment was removed
assert_eq!(iter.next(), Some("[1,2,3")); // Trailing commas was removed
assert_eq!(iter.next(), Some("]\"bar\""));
assert_eq!(iter.next(), None);

Dependencies

~270KB