Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/dominictarr/JSONStream
rawStream.pipe(JSONStream.parse()).pipe(streamOfObjects)
https://github.com/dominictarr/JSONStream
Last synced: 11 days ago
JSON representation
rawStream.pipe(JSONStream.parse()).pipe(streamOfObjects)
- Host: GitHub
- URL: https://github.com/dominictarr/JSONStream
- Owner: dominictarr
- License: other
- Archived: true
- Created: 2011-09-23T07:03:24.000Z (about 13 years ago)
- Default Branch: master
- Last Pushed: 2018-10-14T01:23:58.000Z (about 6 years ago)
- Last Synced: 2024-10-23T12:37:07.469Z (16 days ago)
- Language: JavaScript
- Size: 245 KB
- Stars: 1,918
- Watchers: 36
- Forks: 165
- Open Issues: 54
-
Metadata Files:
- Readme: readme.markdown
- License: LICENSE.APACHE2
Awesome Lists containing this project
- awesome-nodejs-cn - JSONStream - 流式处理 JSON.parse 和 stringify (包 / 解析)
- awesome-nodejs - JSONStream - streaming JSON.parse and stringify. ![](https://img.shields.io/github/stars/dominictarr/JSONStream.svg?style=social&label=Star) (Repository / Streams)
- awesome-nodejs-cn - JSONStream - **star:1906** 流JSON解析函数,把 ![项目已归档][Archived] (包 / 解析)
- awesome-nodejs - JSONStream - Streaming JSON.parse and stringify. (Packages / Parsing)
- awesome-nodejs - JSONStream - rawStream.pipe(JSONStream.parse()).pipe(streamOfObjects) - ★ 1592 (Parsing)
- awesome-nodejs-streams - dominictarr/JSONStream - streaming JSON.parse and stringify (Modules)
- awesome-node - JSONStream - Streaming JSON.parse and stringify. (Packages / Parsing)
- awesome-nodejs-cn - JSONStream - JSON.parse&stringify流处理工具. (目录 / 解析工具)
README
# JSONStream
streaming JSON.parse and stringify
![](https://secure.travis-ci.org/dominictarr/JSONStream.png?branch=master)
## install
```npm install JSONStream```## example
``` js
var request = require('request')
, JSONStream = require('JSONStream')
, es = require('event-stream')request({url: 'http://isaacs.couchone.com/registry/_all_docs'})
.pipe(JSONStream.parse('rows.*'))
.pipe(es.mapSync(function (data) {
console.error(data)
return data
}))
```## JSONStream.parse(path)
parse stream of values that match a path
``` js
JSONStream.parse('rows.*.doc')
```The `..` operator is the recursive descent operator from [JSONPath](http://goessner.net/articles/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:
``` bash
curl -sS localhost:5984/tests/_all_docs&include_docs=true
```
you will get something like this:``` js
{"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 `Stream` that parses the documents from the feed like this:
``` js
var stream = JSONStream.parse(['rows', true, 'doc']) //rows, ANYTHING, docstream.on('data', function(data) {
console.log('received:', data);
});
//emits anything from _before_ the first match
stream.on('header', function (data) {
console.log('header:', data) // => {"total_rows":129,"offset":0}
})```
awesome!In case you wanted the contents the doc emitted:
``` js
var stream = JSONStream.parse(['rows', true, 'doc', {emitKey: true}]) //rows, ANYTHING, doc, items in docs with keysstream.on('data', function(data) {
console.log('key:', data.key);
console.log('value:', data.value);
});```
You can also emit the path:
``` js
var stream = JSONStream.parse(['rows', true, 'doc', {emitPath: true}]) //rows, ANYTHING, doc, items in docs with keysstream.on('data', function(data) {
console.log('path:', data.path);
console.log('value:', data.value);
});```
### 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.```js
{
"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)
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.## 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.## unix tool
query npm to see all the modules that browserify has ever depended on.
``` bash
curl https://registry.npmjs.org/browserify | JSONStream 'versions.*.dependencies'
```## numbers
numbers will be emitted as numbers.
huge numbers that cannot be represented in memory as javascript numbers will be emitted as strings.
cf https://github.com/creationix/jsonparse/commit/044b268f01c4b8f97fb936fc85d3bcfba179e5bb for details.## Acknowlegements
this module depends on https://github.com/creationix/jsonparse
by Tim Caswell
and also thanks to Florent Jaby for teaching me about parsing with:
https://github.com/Floby/node-json-streams## license
Dual-licensed under the MIT License or the Apache License, version 2.0