Skip to content
This repository was archived by the owner on Nov 25, 2021. It is now read-only.

neuroo/json-ast

This branch is 23 commits ahead of, 135 commits behind vtrushin/json-to-ast:master.

Folders and files

NameName
Last commit message
Last commit date

Latest commit

author
rgaucher
Apr 11, 2017
36692fa · Apr 11, 2017
Jul 28, 2016
Mar 22, 2017
Sep 12, 2016
May 15, 2016
May 19, 2016
Jul 25, 2016
Jul 25, 2016
Jul 26, 2016
May 29, 2016
Jul 25, 2016
Sep 12, 2016
Jul 25, 2016
Apr 11, 2017

Repository files navigation

A tolerant JSON parser

Build Status

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:

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...
  */

Install

npm install json-ast

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.js.

API

import {parse, Visitor, AST} from 'json-ast';

// The visitor can stop at any time by assigning `Visitor.stop = true`
class MyVisitor extends Visitor {
  constructor() {
    super();
    this.comments = [];
  }

  comment(commentNode) {
    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 AST.JsonDocument);

const visitor = new MyVisitor();
ast.visit(visitor);
assert.deepEqual(visitor.comments, [" Some comment"]);

// One can also the `JsonNode.toJSON` static method to convert to a JavaScript object
const obj = JsonNode.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 default
  • junker: enables an error recovery mode, false by default

License

MIT Vlad Trushin and Romain Gaucher

Releases

No releases published

Packages

No packages published

Languages

  • JavaScript 100.0%