jq umí zpracovávat nejen jeden JSON, ale i sekvenci jednotlivých JSON “dokumentů” za sebou. Např. `cat *.json | jq .foobar` bude normálně fungovat.
Specifickým takovým formátem je JSONL - “JSON Lines”, viz http://jsonlines.org/
Je to velmi zajímavá volba v případě, kdy potřebujete serializovat gigabajty dat, a přitom nechcete, aby bylo potřeba alokovat paměť pro gigabajtové pole jen kvůli (de)serializaci. Když to uděláte jako JSONL, tak pracujete jen s jednotlivými řádky/položkami a streamujete je do souboru/přes síť.
Nevím, co je to klasický streaming, ale nějaký streaming (možná neklasický) jq umí: https://github.com/stedolan/jq/issues/1984
Viděl jsem ho tam už dávno, ale nikdy jsem to nezkoušel ani nepotřeboval.
6. 8. 2020, 09:53 editováno autorem komentáře
Klasickým streamingem jsem myslel přístup, jaký má SAX, kdežto jq má přístup podobný DOMu (což je výhoda i nevýhoda, záleží na způsobu použití). Ten linkovaný streaming je něco dost jiného, to je trik, jak původní JSON rozdělit do série dalších JSONů, které se musí zpracovat (jinak) znovu dalším jq. Te je oproti SAXu dost podstatný rozdíl.
> to je trik, jak původní JSON rozdělit do série dalších JSONů, které se musí zpracovat (jinak) znovu dalším jq.
Z dokumentace jsem pochopil, že se tato transformace vztahuje na vstup, ne na výstup:
> With the --stream option jq can parse input texts in a streaming fashion, allowing jq programs to start processing large JSON texts immediately rather than after the parse completes. If you have a single JSON text that is 1GB in size, streaming it will allow you to process it much more quickly.
(Z https://stedolan.github.io/jq/manual/#Streaming , zvýrazněno mnou.)
Rozdíly oproti SAXu plynou IMHO hlavně ze zřejmě čistě funkcionálního přístupu jq oproti imperativnímu zpracování eventů v SAXu. Ale jinak mi to přijde dost podobné.
Jejda, nechapu, ze misto lepeni, grep, sed, tr, dohromady me nenapadlo takovy nastroj hledat!
Diky moc za clanek :)
To je zvláštní, asi něco rozbil RedSys (má problémy s delšími články, kde jsou zdrojové kódy:/)
V každém případě stahujte prosím odsud:
https://gist.github.com/tisnik/9e1f0354222805fd8046f18e767c2834