Transforms JSON stream to JS Objects
$ npm install '@oresoftware/json-stream-parser'import{JSONParser}from'@oresoftware/json-stream-parser';const{JSONParser}=require('@oresoftware/json-stream-parser');Right now, the library assumes each separate chunk of json is separated by newline characters.
In the future, we could attempt to use a different delimiting character, as a user-provided input variable.
Recommendations welcome.
process.stdin.resume().pipe(newJSONParser()).on('data',d=>{// now we got some POJSOs!});import*asnetfrom'net';const[port,host]=[6970,'localhost'];constws=net.createConnection(port,host);ws.setEncoding('utf8').pipe(newJSONParser())// tcp connection is bidirection/full-duplex .. we send JSON strings each way.on('data',onData);// we receive data coming from the tcp server here// and we send data like this:ws.write(JSON.stringify({'some':'data'})+'\n','utf8',cb);// make sure to include the newline char when you writeconstk=cp.spawn('bash');k.stdin.end(`echo '{"foo":"bar"}\n'`);// make sure to include the newline char when you writek.stdout.pipe(newJSONParser()).on('data',d=>{// => {foo: 'bar'}});constk=cp.spawn('bash');k.stdin.end(` foo="medicine" cat <<EOF\n{"foo":"$foo"}\nEOF # make sure to include the newline char when you write`);k.stdout.pipe(newJSONParser()).on('data',d=>{assert.deepStrictEqual(d,{foo: 'medicine'});// should pass});If you JSON has unescaped newlines, or the JSON is separated by some other character, then use the delimiter option.
newJSONParser({delimiter: '∆∆∆'});// use 3 alt-j's to separate json chunks, since newlines won't workFor other solutions to parsing JSON from CLIs, see: https://stackoverflow.com/questions/56014438/get-single-line-json-from-aws-cli
- delayEvery: integer
JSONParser delays the transform callback every x chunks. LiveMutexJSONParser delays every x non-empty JSON records, which is better for long JSONL chunks that should not monopolize the event loop.
import{LiveMutexJSONParser,createLiveMutexJSONParser}from'@oresoftware/json-stream-parser';constparser=newLiveMutexJSONParser({delayEvery: 1024});constparserWithDefaultDelay=createLiveMutexJSONParser();- emitNonJSON: boolean
if there is a line of input that cannot be JSON parsed, it will be emitted as "string", but it will not pushed to output
- there are some secret options in the code, have a look in
lib/main.ts