minipass-json-stream
Like JSONStream, but using Minipass streams
install
npm install minipass-json-stream
example
const request = const JSONStream = const es =
new JSONStream(options)
Create a new stream. This is a minipass stream
that is always set in objectMode
. It emits objects parsed out of
string/buffer JSON input that match the supplied path
option.
JSONStream.parse(path)
Return a new JSONStream object to stream values that match a path.
(Equivalent to new JSONStream({path})
.)
JSONStream
The ..
operator is the recursive descent operator from
JSONPath, which will match a
child at any depth (see examples below).
If your keys have keys that include .
or *
etc, use an array instead.
['row', true, /^doc/]
.
If you use an array, RegExp
s, booleans, and/or functions. The ..
operator is also available in array representation, using {recurse: true}
. any object that matches the path will be emitted as 'data' (and
pipe
d down stream)
If path
is empty or null, no 'data' events are emitted.
If you want to have keys emitted, you can prefix your *
operator with
$
: obj.$*
- in this case the data passed to the stream is an object
with a key
holding the key and a value
property holding the data.
Examples
query a couchdb view:
curl -sS localhost:5984/tests/_all_docs&include_docs=true
you will get something like this:
"total_rows":129"offset":0"rows":"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":"_id":"change2_0.6995461115147918""_rev":"1-13677d36b98c0c075145bb8975105153""hello":2
we are probably most interested in the rows.*.doc
create a JSONStream
that parses the documents from the feed like this:
var stream = JSONStream //rows, ANYTHING, docstream;//emits anything from _before_ the first matchstream
awesome!
In case you wanted the contents the doc emitted:
// equivalent to: 'rows.*.doc.$*'var stream = JSONStream//rows, ANYTHING, doc, items in docs with keysstream;
You can also emit the path:
var stream = JSONStream//rows, ANYTHING, doc, items in docs with keysstream;
recursive patterns (..)
JSONStream.parse('docs..value')
(or JSONStream.parse(['docs', {recurse: true}, 'value'])
using an array)
will emit every value
object that is a child, grand-child, etc. of the
docs
object. In this example, it will match exactly 5 times at various depth
levels, emitting 0, 1, 2, 3 and 4 as results.
"total": 5 "docs": "key": "value": 0 "some": "property" "value": 1 "value": 2 "blbl": {} "a":0 "b":1 "value":3 10 "value": 4
JSONStream.parse(pattern, map)
(Equivalent to new JSONStream({ pattern, map })
)
provide a function that can be used to map or filter
the json output. map
is passed the value at that node of the pattern,
if map
return non-nullish (anything but null
or undefined
)
that value will be emitted in the stream. If it returns a nullish value,
nothing will be emitted.
JSONStream
also emits 'header'
and 'footer'
events,
the 'header'
event contains anything in the output that was before
the first match, and the 'footer'
, is anything after the last match.
Acknowlegements
This module is a fork of JSONStream by Dominic Tarr, modified and redistributed under the terms of the MIT license.
this module depends on https://github.com/creationix/jsonparse by Tim Caswell