@mojule/json-tree
v1.0.0
Published
Tree API over JSON-compatible objects
Downloads
6
Readme
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() )