json-sharp
Process operations on pure JSON objects.
How it works
JSONSharp.process
clones an object and processes operations returning a
modified object.
Operations are simple objects with a single property representing its name.
The operation name should be preceded by the #
(sharp) symbol to avoid
conflicts with real data.
The property value is processed by the operation logic using a given context.
Motivation
Some systems need slightly different configuration between environments and
contexts. This technique allows to have a good degree of reuse with a simple
format.
Example
Given the following object and context:
var config = {
'#merge': [
{debug: true, url: 'http://localhost'},
{
'#switch': {
'#property': 'env',
'#case': {
dev: {
url: 'http://dev.com/'
},
prod: {
url: 'http://prod.com/',
debug: false
}
}
}
}
]
};
var context = {
env: 'dev'
};
var devConfig = require('JSONSharp').process(config, context);
Results in the following devConfig
object:
{
debug: true,
url: 'http://dev.com/'
}
Operations
#merge
The #merge
operation takes a list of objects and deeply merges its properties
using the deepmerge library.
Examples:
JSONSharp.process({'#merge': [{a: 'a'}, {b: 'b']}, {});
#switch
The #switch
operation works much like the switch Javascript statement, with the exception that it doesn't
use a break
statement.
It takes an object with the following properties:
#property
: the property name or JSONPath
to be matched for results#case
: an object mapping #property
values to desired results#case.#default
: the value will be used if no matching value is found
Examples:
var switchObj = {
'#switch': {
'#property': 'name',
'#case': {a: 'Prop A', '#default': 'not found'}
}
};
JSONSharp.process(switchObj, {});
JSONSharp.process(switchObj, {name: 'a'});
JSONSharp.process(switchObj, {name: '$.a'});
Property resolution
A #property
starting with $.
will be resolved using the
JSONPath library, otherwise simple
property access will be used.