41 releases (breaking)

Uses new Rust 2024

0.29.0 Jan 10, 2026
0.28.0 Nov 27, 2025
0.27.1 Nov 12, 2025
0.26.3 Jul 22, 2025
0.12.2 Jun 7, 2020

#79 in Parser implementations

Download history 62772/week @ 2025-10-29 55719/week @ 2025-11-05 51001/week @ 2025-11-12 58159/week @ 2025-11-19 42046/week @ 2025-11-26 56619/week @ 2025-12-03 46087/week @ 2025-12-10 44306/week @ 2025-12-17 38264/week @ 2025-12-24 41720/week @ 2025-12-31 56284/week @ 2026-01-07 42297/week @ 2026-01-14 67130/week @ 2026-01-21 55677/week @ 2026-01-28 70031/week @ 2026-02-04 77782/week @ 2026-02-11

279,201 downloads per month
Used in 174 crates (53 directly)

MIT license

225KB
6.5K SLoC

jsonc-parser

A JSON parser and manipulator for Rust that supports comments and other JSON extensions.

Documentation

For usage examples and API documentation, see the rustdoc documentation.


lib.rs:

jsonc-parser

A JSON parser and manipulator that supports comments and other JSON extensions.

Parsing

To a simple JsonValue:

use jsonc_parser::parse_to_value;

let json_value = parse_to_value(r#"{ "test": 5 } // test"#, &Default::default())?;
// check the json_value here

Or an AST:

use jsonc_parser::parse_to_ast;
use jsonc_parser::CollectOptions;
use jsonc_parser::CommentCollectionStrategy;

let parse_result = parse_to_ast(r#"{ "test": 5 } // test"#, &CollectOptions {
    comments: CommentCollectionStrategy::Separate, // include comments in result
    tokens: true, // include tokens in result
}, &Default::default())?;
// ...inspect parse_result for value, tokens, and comments here...

Manipulation (CST)

When enabling the cst cargo feature, parsing to a CST provides a first class manipulation API:

use jsonc_parser::cst::CstRootNode;
use jsonc_parser::ParseOptions;
use jsonc_parser::json;

let json_text = r#"{
  // comment
  "data": 123
}"#;

let root = CstRootNode::parse(json_text, &ParseOptions::default()).unwrap();
let root_obj = root.object_value_or_set();

root_obj.get("data").unwrap().set_value(json!({
  "nested": true
}));
root_obj.append("new_key", json!([456, 789, false]));

assert_eq!(root.to_string(), r#"{
  // comment
  "data": {
    "nested": true
  },
  "new_key": [456, 789, false]
}"#);

Serde

If you enable the "serde" feature as follows:

# in Cargo.toml
jsonc-parser = { version = "...", features = ["serde"] }

Then you can use the parse_to_serde_value function to get a serde_json::Value:

use jsonc_parser::parse_to_serde_value;

let json_value = parse_to_serde_value(r#"{ "test": 5 } // test"#, &Default::default())?;

Alternatively, use parse_to_ast then call .into() (ex. let value: serde_json::Value = ast.into();).

Parse Strictly as JSON

By default this library is extremely loose in what it allows parsing. To be strict, provide ParseOptions and set all the options to false:

use jsonc_parser::parse_to_value;
use jsonc_parser::ParseOptions;

let json_value = parse_to_value(text, &ParseOptions {
  allow_comments: false,
  allow_loose_object_property_names: false,
  allow_trailing_commas: false,
  allow_missing_commas: false,
  allow_single_quoted_strings: false,
  allow_hexadecimal_numbers: false,
  allow_unary_plus_numbers: false,
})?;

Error column number with unicode-width

To get more accurate display column numbers in error messages, enable the error_unicode_width cargo feature, which will pull in and use the unicode-width dependency internally. Otherwise it will use the character count, which isn't as accurate of a number, but will probably be good enough in most cases.

Dependencies

~0–790KB
~13K SLoC