@mojule/json-tree v1.0.0
json-tree
Important - this documentation describes a previous version and needs to be updated - however, the tests are up to date and serve as examples until this has been done
Use tree API over JSON-compatible objects
Install
npm install @mojule/json-tree
Example
const JsonTree = require( '@mojule/json-tree' )
const jsonData = require( './test-data.json' )
const tree = JsonTree( jsonData )
const numbers = tree.findAll( node => node.isNumber() )
numbers.forEach( numberNode => {
const value = node.getValue( 'nodeValue' )
value *= 2
node.setValue( 'nodeValue', value )
})
const newData = tree.toJson()
console.log( JSON.stringify( newData, null, 2 ) )API
Inherits the same API as tree and tree-factory, and adds the following plugins:
toJson
Converts a node back to it's JSON compatible object representation
const objNode = JsonTree( { foo: 'bar' } )
const obj = objNode.toJson()
// { foo: 'bar' }
console.log( obj )isEmpty
Overrides the default implementation (which always returns false) and returns
true if the node represents null, string, number or boolean.
This ensures that trying to add children to any of these nodes will throw an error - see the tree-factory documentation for more details.
const arrayNode = JsonTree( [ 36 ] )
const numNode = JsonTree( 42 )
// OK
arrayNode.add( numNode )
// throws
numNode.add( arrayNode )slug
Overrides the default implementation so that if a node is a property node,
the propertyName is returned instead of the node's index within its parent.
This also affects getPath and atPath, as paths are generated from slugs
const objNode = JsonTree( { foo: 'bar' } )
const fooNode = objNode.getProperty( 'foo' )
// 'foo'
console.log( fooNode.slug() )
// '/foo'
console.log( fooNode.getPath() )Property plugins
Only added to object nodes.
getProperty
Returns the node representing a named property on an object node. Returns
undefined if the object does not have the property.
const objNode = JsonTree( { foo: 'bar' } )
const fooNode = objNode.getProperty( 'foo' )
// 'bar'
console.log( fooNode.getValue( 'nodeValue' ) )setProperty
Sets the named property on the object, replacing it if it already exists
const objNode = JsonTree( { foo: 'bar' } )
objNode.setProperty( 'foo', JsonTree( 'new bar' ) )
const fooNode = objNode.getProperty( 'foo' )
// 'new bar'
console.log( fooPropertyNode.getValue( 'nodeValue' ) )hasProperty
Returns true if the object has the named property, false if not.
const objNode = JsonTree( { foo: 'bar' } )
// true
console.log( objNode.hasProperty( 'foo' ) )
// false
console.log( objNode.hasProperty( 'nope' ) )removeProperty
Removes the named property node from the object node. Will throw if the named property does not exist.
const objNode = JsonTree( { foo: 'bar' } )
// true
console.log( objNode.hasProperty( 'foo' ) )
objNode.removeProperty( 'foo' )
// false
console.log( objNode.hasProperty( 'foo' ) )renameProperty
Renames the named property. Will throw if the named property does not exist.
const objNode = JsonTree( { foo: 'bar' } )
// true
console.log( objNode.hasProperty( 'foo' ) )
objNode.renameProperty( 'foo', 'newFoo' )
// false
console.log( objNode.hasProperty( 'foo' ) )
// true
console.log( objNode.hasProperty( 'newFoo' ) )keys
Returns a list of all the object node's property names
const objNode = JsonTree( { foo: 'bar', abc: 'xyz' } )
// [ 'foo', 'abc' ]
console.log( objNode.keys() )values
Returns a list of all the object node's property values
const objNode = JsonTree( { foo: 'bar', abc: 'xyz' } )
// [ 'bar', 'xyz' ]
console.log( objNode.values() )Type plugins
isObject, isArray, isString, isNumber, isBoolean, isNull
const objNode = JsonTree( { foo: 'bar' } )
// true
console.log( objNode.isObject() )
// false
console.log( objNode.isArray() )