Skip to content
This repository


Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP


branch: master

This branch is 0 commits ahead and 0 commits behind master

Fetching latest commit…

Cannot retrieve the latest commit at this time



streaming JSON.parse and stringify


var request = require('request')
  , JSONStream = require('JSONStream')
  , es = require('event-stream')

var parser = JSONStream.parse(['rows', /./])
  , req = request({url: ''})
  , logger = es.mapSync(function (data) {
      return data

in node 0.4.x


in node v0.5.x



usally, a json API will return a list of objects.

path should be an array of property names and/or RedExps.
any object that matches the path will be emitted as 'data' (and piped down stream)

if path is empty or null, or if no matches are made:
JSONStream.parse will only one 'data': the root object.

(this is useful when there is an error, because the error will probably not match your path)


query a couchdb view:

curl -sS localhost:5984/tests/_all_docs&include_docs=true

you will get something like this:

  { "id":"change1_0.6995461115147918"
  , "key":"change1_0.6995461115147918"
  , "value":{"rev":"1-e240bae28c7bb3667f02760f6398d508"}
  , "doc":{
      "_id":  "change1_0.6995461115147918"
    , "_rev": "1-e240bae28c7bb3667f02760f6398d508","hello":1}
  { "id":"change2_0.6995461115147918"
  , "key":"change2_0.6995461115147918"
  , "value":{"rev":"1-13677d36b98c0c075145bb8975105153"}
  , "doc":{
    , "_rev":"1-13677d36b98c0c075145bb8975105153"
    , "hello":2

we are probably most interested in the rows.*.docs

create a Stream that parses the documents from the feed like this:

JSONStream.parse(['rows', /./, 'doc']) //rows, ANYTHING, doc


JSONStream.stringify(open, sep, close)

Create a writable stream.

you may pass in custom open, close, and seperator strings.
But, by default, JSONStream.stringify() will create an array,
(with default options open='[\n', sep='\n,\n', close='\n]\n')

If you call JSONStream.stringify(false)
the elements will only be seperated by a newline.

If you only write one item this will be valid JSON.

If you write many items,
you can use a RegExp to split it into valid chunks.

JSONStream.stringifyObject(open, sep, close)

Very much like JSONStream.stringify, but creates a writable stream for objects instead of arrays.

Accordingly, open='{\n', sep='\n,\n', close='\n}\n'.

When you .write() to the stream you must supply an array with [ key, data ] as the first argument.


There are occasional problems parsing and unparsing very precise numbers.

I have opened an issue here:



this module depends on
by Tim Caswell
and also thanks to Florent Jaby for teaching me about parsing with:

Something went wrong with that request. Please try again.