@anchan828/json-ast v2.2.0
Note: This repository resolves several performance issues and updates dependent packages. There are no plans to add new features.
A tolerant JSON parser
Install
npm install @anchan828/json-ast
Features
The original code was developed by Vlad Trushin. Breaking modifications were made by Romain Gaucher to create a less strict JSON parser. Additionally, a more typical interaction with the AST has been implemented.
Current modifications and features as of 2.1.6
include:
- Creation of a
JsonDocument
root node and more formal AST structure - Support for inline comments
- Support for multi-line comments
- Support for trailing commas and many consecutive commas
- Include visitor pattern to visit the AST
- Include a limited error-recovery mode trying to catch (when
junker
set totrue
):- unclosed objects or arrays
- too many closing braces or brackets
- automatic comma injection
- support for unquoted keys
- Conversion to a native JavaScript object from
JsonNode
Basic examples are available to show how to use this package.
JSONish
The JSON parser accepts a superset of the JSON language:
// some comment
{
"key1": "value1", // some other comments
"key2": "value2",
,
,
/*
Oh dear! It's important to put this here.
And we love commas too!
And we're missing the closing brace...
*/
Structure of the AST
As of 2.1.0, the AST is defined with the following types:
[JsonNode] // Essentially an abstract class
position: [Position]
[JsonDocument] extends [JsonNode]
child: [?]*
comments: [JsonComment]*
[JsonValue] extends [JsonNode]
value: [?]
[JsonObject] extends [JsonNode]
properties: [JsonProperty]*
comments: [JsonComment]*
[JsonProperty] extends [JsonNode]
key: [JsonKey]
value: [?]*
[JsonKey] extends [JsonValue]
[JsonArray]
items: *
comments: [JsonComment]*
[JsonComment] extends [JsonValue]
[JsonString] extends [JsonValue]
[JsonNumber] extends [JsonValue]
[JsonTrue] extends [JsonValue]
[JsonFalse] extends [JsonValue]
[JsonNumber] extends [JsonValue]
All the types exists in src/ast.ts.
API
import { parse, Visitor, toJSON } from "json-ast";
// The visitor can stop at any time by assigning `Visitor.stop = true`
class MyVisitor extends Visitor {
private comments: string[] = []
public comment(commentNode: JsonComment): void {
this.comments.push(commentNode.value);
}
}
const JSON_BUFFER = `// Some comment
{
"key": "value"
`;
// `verbose` will include the position in each node
const ast = parse(JSON_BUFFER, { verbose: true, junker: true });
assert(ast instanceof JsonDocument);
const visitor = new MyVisitor();
visitor.visit(ast);
assert.deepEqual(visitor.comments, [" Some comment"]);
// One can also the `toJSON(JsonNode)` static method to convert to a JavaScript object
const obj = toJSON(ast);
assert(obj.key === "value");
Parsing Options
The second argument of the parse
function takes an object with the following settings:
verbose
: include positions in each AST node,true
by defaultjunker
: enables an error recovery mode,false
by default
License
MIT Vlad Trushin and Romain Gaucher and anchan828
8 months ago
8 months ago
9 months ago
9 months ago
9 months ago
10 months ago
9 months ago
10 months ago
10 months ago
10 months ago
10 months ago
12 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
12 months ago
12 months ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
3 years ago
3 years ago
2 years ago
2 years ago
2 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
4 years ago
3 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago