Node: Asynchronous version of JSON.stringify()
/*
const { createJSONStream } = require('ajsonify');
createJSONStream( <Object>, [null, [<spaces>, [[<readable options>], <block-size>]]]] ) : <stream>
*/
const { createJSONStream, copy_object, stringify_g } = require ( 'ajsonify' ) ;
const { createWriteStream } = require ( 'fs' ) ;
let o = {
hello : 'world' ,
num : 1 ,
child : { arr : [ 1 , 2 , 3 , 4 , 'string' ] } ,
array : [ null , void 0 , void 0 , null ] ,
no : null ,
undefined : void 0 ,
rus : 'русские буквы' ,
rus2 : '\\слеш \\ слеш \\ слеш \\ бэкслеш / бэкслеш /' ,
kav1 : `'` ,
kav2 : `"` ,
special : '\t\n\r' ,
date : new Date ( ) ,
string : new String ( 'string' ) ,
number : new Number ( 123456 ) ,
boolean : new Boolean ( false ) ,
symbol : Symbol ( 'symbol' ) ,
empty_array : [ ] ,
empty_object : { }
}
let o_cp = { ...o } ;
//circular ref. protection test
o . o = o ;
o [ o . special ] = 'special' ;
o . child2 = o . child ;
o . empty_4 = [ ] ;
o . empty_4 . length = 4 ;
console . dir ( o , { depth : null } ) ;
console . dir ( copy_object ( o ) , { depth : null } ) ;
const assert = require ( 'assert' ) . strict ;
assert . ok ( [ ...stringify_g ( o_cp ) ] . join ( '' ) === JSON . stringify ( o_cp ) , 'JSON not equal!' ) ;
createJSONStream ( o , null , 3 ) . pipe ( process . stdout ) ;
//you can change object - createJSONStream make a copy to continue processing async.
Object . keys ( o ) . forEach ( k => delete o [ k ] ) ;
//test huge array
let very_big_array = [ ] ;
very_big_array [ 10000000 ] = 'last' ;
let out = createWriteStream ( __dirname + '/out.json' , 'utf8' ) ;
console . time ( 'stream' ) ;
createJSONStream ( very_big_array , null , 2 ) . pipe ( out ) . on ( 'close' , ( ) => {
console . timeEnd ( 'stream' ) ;
} ) ;
very_big_array . length = 0 ; //it's ok!
setInterval ( ( ) => process . stdout . write ( '.' ) , 1000 ) . unref ( ) ;