Package Exports
- bfj
This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (bfj) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.
Readme
BFJ
Big-friendly JSON. Asynchronous streaming functions for large JSON data sets.
- Why would I want those?
- What functions does it implement?
- How do I install it?
- How do I use it?
- Is there a change log?
- How do I set up the dev environment?
- What versions of node.js does it support?
- What license is it released under?
Why would I want those?
If you need to parse large JSON strings or stringify large JavaScript data sets, it makes sense to do so asynchronously rather than monopolising the event loop. BFJ implements those asynchronous functions.
What functions does it implement?
Seven functions are exported.
Three are concerned with parsing, or turning JSON strings into JavaScript data:
walkasynchronously walks a stream, emitting events as it encounters JSON tokens. Analagous to a SAX parser.parseasynchronously parses a stream of JSON.readasynchronously parses a JSON file from disk.
The four remaining functions handle the reverse transformations; serialising JavaScript data to JSON:
eventifyasynchronously traverses a data structure depth-first, emitting events as it encounters items. By default it coerces promises, buffers, dates and iterables to JSON-friendly values.streamifyasynchronously serialises data to a stream of JSON.stringifyasynchronously serialises data to a JSON string.writeasynchronously serialises data to a JSON file on disk.
How do I install it?
If you're using npm:
npm install bfj --saveOr if you just want the git repo:
git clone git@github.com:philbooth/bfj.gitHow do I use it?
Import the library
using require:
var bfj = require('bfj');Seven functions
are exported:
walk,
parse,
read,
eventify,
streamify,
stringify and
write.
bfj.walk (stream, options)
walk returns an event emitter
and asynchronously walks
a stream of JSON data,
emitting events
as it encounters
tokens.
It takes two arguments; a readable stream from which the JSON will be read and an options object that supports the following property.
options.discard: The number of characters to process before discarding them to save memory. The default value is16384.
The emitted events
are defined
as public properties
of an object,
bfj.events:
bfj.events.arrayindicates that an array context has been entered by encountering the[character.bfj.events.endArrayindicates that an array context has been left by encountering the]character.bfj.events.objectindicates that an object context has been entered by encountering the{character.bfj.events.endObjectindicates that an object context has been left by encountering the}character.bfj.events.propertyindicates that a property has been encountered in an object. The listener will be passed the name of the property as its argument and the next event to be emitted will represent the property's value.bfj.events.stringindicates that a string has been encountered. The listener will be passed the value as its argument.bfj.events.numberindicates that a number has been encountered. The listener will be passed the value as its argument.bfj.events.literalindicates that a JSON literal (eithertrue,falseornull) has been encountered. The listener will be passed the value as its argument.bfj.events.errorindicates that a syntax error has occurred. The listener will be passed theErrorinstance as its argument.bfj.events.endindicates that the end of the input has been reached and the stream is closed.
Example
var emitter = bfj.walk(fs.createReadStream(path));
emitter.on(bfj.events.array, array);
emitter.on(bfj.events.object, object);
emitter.on(bfj.events.property, property);
emitter.on(bfj.events.string, value);
emitter.on(bfj.events.number, value);
emitter.on(bfj.events.literal, value);
emitter.on(bfj.events.endArray, endScope);
emitter.on(bfj.events.endObject, endScope);
emitter.on(bfj.events.error, error);
emitter.on(bfj.events.end, end);bfj.parse (stream, options)
parse returns a promise
and asynchronously parses
a stream of JSON data.
It takes two arguments; a readable stream from which the JSON will be parsed and an options object that supports the following properties.
options.reviver: Transformation function, invoked depth-first against the parsed data structure. This option is analagous to the reviver parameter for JSON.parse.options.discard: The number of characters to process before discarding them to save memory. The default value is16384.
If there are no syntax errors, the returned promise is resolved with the parsed data. If syntax errors occur, the promise is rejected with the first error.
Example
bfj.parse(fs.createReadStream(path)).
then(function (data) {
// :)
}).
catch(function (error) {
// :(
});bfj.read (path, options)
read returns a promise and
asynchronously parses
a JSON file
read from disk.
It takes two arguments; the path to the JSON file and an options object that supports the following properties.
options.reviver: Transformation function, invoked depth-first against the parsed data structure. This option is analagous to the reviver parameter for JSON.parse.options.discard: The number of characters to process before discarding them to save memory. The default value is16384.
If there are no syntax errors, the returned promise is resolved with the parsed data. If syntax errors occur, the promise is rejected with the first error.
Example
bfj.read(path).
then(function (data) {
// :)
}).
catch(function (error) {
// :(
});bfj.eventify (data, options)
eventify returns an event emitter
and asynchronously traverses
a data structure depth-first,
emitting events as it
encounters items.
By default it coerces
promises, buffers, dates and iterables
to JSON-friendly values.
It takes two arguments; the data structure to traverse and an options object that supports the following properties.
options.promises: By default, promises are coerced to their resolved value. Set this property toignoreif you'd prefer to ignore promises in the data.options.buffers: By default, buffers are coerced using theirtoStringmethod. Set this property toignoreif you'd prefer to ignore buffers in the data.options.dates: By default, dates are coerced using theirtoJSONmethod. Set this property toignoreif you'd prefer to ignore dates in the data.options.maps: By default, maps are coerced to plain objects. Set this property toignoreif you'd prefer to ignore maps in the data.options.iterables: By default, other iterables (i.e. not arrays, strings or maps) are coerced to arrays. Set this property toignoreif you'd prefer to ignore other iterables in the data.
The emitted events
are defined
as public properties
of an object,
bfj.events:
bfj.events.arrayindicates that an array has been encountered.bfj.events.endArrayindicates that the end of an array has been encountered.bfj.events.objectindicates that an object has been encountered.bfj.events.endObjectindicates that the end of an object has been encountered.bfj.events.propertyindicates that a property has been encountered in an object. The listener will be passed the name of the property as its argument and the next event to be emitted will represent the property's value.bfj.events.stringindicates that a string has been encountered. The listener will be passed the value as its argument.bfj.events.numberindicates that a number has been encountered. The listener will be passed the value as its argument.bfj.events.literalindicates that a JSON literal (eithertrue,falseornull) has been encountered. The listener will be passed the value as its argument.bfj.events.endindicates that the end of the data has been reached and no further events will be emitted.
Example
var emitter = bfj.eventify(data);
emitter.on(bfj.events.array, array);
emitter.on(bfj.events.object, object);
emitter.on(bfj.events.property, property);
emitter.on(bfj.events.string, string);
emitter.on(bfj.events.number, value);
emitter.on(bfj.events.literal, value);
emitter.on(bfj.events.endArray, endArray);
emitter.on(bfj.events.endObject, endObject);
emitter.on(bfj.events.end, end);bfj.streamify (data, options)
streamify returns a readable stream
and asynchronously serialises
a data structure to JSON,
pushing the result
to the returned stream.
It takes two arguments; the data structure to serialise and an options object that supports the following properties.
options.space: Indentation string or the number of spaces to indent each nested level by. This option is analagous to the space parameter for JSON.stringify.options.promises: By default, promises are coerced to their resolved value. Set this property toignoreif you'd prefer to ignore promises in the data.options.buffers: By default, buffers are coerced using theirtoStringmethod. Set this property toignoreif you'd prefer to ignore buffers in the data.options.dates: By default, dates are coerced using theirtoJSONmethod. Set this property toignoreif you'd prefer to ignore dates in the data.options.maps: By default, maps are coerced to plain objects. Set this property toignoreif you'd prefer to ignore maps in the data.options.iterables: By default, other iterables (i.e. not arrays, strings or maps) are coerced to arrays. Set this property toignoreif you'd prefer to ignore other iterables in the data.
Example
var stream = bfj.streamify(data);
stream.on('data', read);
stream.on('end', end);bfj.stringify (data, options)
stringify returns a promise and
asynchronously serialises a data structure
to a JSON string.
The promise is resolved
to the JSON string
when serialisation is complete.
It takes two arguments; the data structure to serialise and an options object that supports the following properties.
options.space: Indentation string or the number of spaces to indent each nested level by. This option is analagous to the space parameter for JSON.stringify.options.promises: By default, promises are coerced to their resolved value. Set this property toignoreif you'd prefer to ignore promises in the data.options.buffers: By default, buffers are coerced using theirtoStringmethod. Set this property toignoreif you'd prefer to ignore buffers in the data.options.dates: By default, dates are coerced using theirtoJSONmethod. Set this property toignoreif you'd prefer to ignore dates in the data.options.maps: By default, maps are coerced to plain objects. Set this property toignoreif you'd prefer to ignore maps in the data.options.iterables: By default, other iterables (i.e. not arrays, strings or maps) are coerced to arrays. Set this property toignoreif you'd prefer to ignore other iterables in the data.
Example
bfj.stringify(data).
then(function (json) {
// :)
});bfj.write (path, data, options)
write returns a promise
and asynchronously serialises a data structure
to a JSON file on disk.
The promise is resolved
when the file has been written,
or rejected with the error
if writing failed.
It takes three arguments; the path to the JSON file, the data structure to serialise and an options object that supports the following properties.
options.space: Indentation string or the number of spaces to indent each nested level by. This option is analagous to the space parameter for JSON.stringify.options.promises: By default, promises are coerced to their resolved value. Set this property toignoreif you'd prefer to ignore promises in the data.options.buffers: By default, buffers are coerced using theirtoStringmethod. Set this property toignoreif you'd prefer to ignore buffers in the data.options.dates: By default, dates are coerced using theirtoJSONmethod. Set this property toignoreif you'd prefer to ignore dates in the data.options.maps: By default, maps are coerced to plain objects. Set this property toignoreif you'd prefer to ignore maps in the data.options.iterables: By default, other iterables (i.e. not arrays, strings or maps) are coerced to arrays. Set this property toignoreif you'd prefer to ignore other iterables in the data.
Example
bfj.write(path, data).
then(function () {
// :)
}).
catch(function (error) {
// :(
});Is there a change log?
Yes.
How do I set up the dev environment?
The development environment
relies on node.js,
JSHint,
Mocha,
Chai,
Mockery and
Spooks.
Assuming that
you already have
node and NPM
set up,
you just need
to run
npm install
to install
all of the dependencies
as listed in package.json.
You can
lint the code
with the command
npm run lint.
You can
run the tests
with the command
npm test.
What versions of node.js does it support?
0.12 and the latest stable io.js.
What license is it released under?
MIT.
