• Stars
    star
    561
  • Rank 79,400 (Top 2 %)
  • Language
    Go
  • License
    MIT License
  • Created over 6 years ago
  • Updated about 1 year ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Streaming JSON parser for Go

jstream

GoDoc

jstream is a streaming JSON parser and value extraction library for Go.

Unlike most JSON parsers, jstream is document position- and depth-aware -- this enables the extraction of values at a specified depth, eliminating the overhead of allocating encompassing arrays or objects; e.g:

Using the below example document: jstream

we can choose to extract and act only the objects within the top-level array:

f, _ := os.Open("input.json")
decoder := jstream.NewDecoder(f, 1) // extract JSON values at a depth level of 1
for mv := range decoder.Stream() {
  fmt.Printf("%v\n ", mv.Value)
}

output:

map[desc:RGB colors:[red green blue]]
map[desc:CMYK colors:[cyan magenta yellow black]]

likewise, increasing depth level to 3 yields:

red
green
blue
cyan
magenta
yellow
black

optionally, kev:value pairs can be emitted as an individual struct:

decoder := jstream.NewDecoder(f, 2).EmitKV() // enable KV streaming at a depth level of 2
jstream.KV{desc RGB}
jstream.KV{colors [red green blue]}
jstream.KV{desc CMYK}
jstream.KV{colors [cyan magenta yellow black]}

Installing

go get github.com/bcicen/jstream

Commandline

jstream comes with a cli tool for quick viewing of parsed values from JSON input:

jstream -d 1 < input.json
{"colors":["red","green","blue"],"desc":"RGB"}
{"colors":["cyan","magenta","yellow","black"],"desc":"CMYK"}

detailed output with -v option:

cat input.json | jstream -v -d -1

depth	start	end	type   | value
2	018	023	string | "RGB"
3	041	046	string | "red"
3	048	055	string | "green"
3	057	063	string | "blue"
2	039	065	array  | ["red","green","blue"]
1	004	069	object | {"colors":["red","green","blue"],"desc":"RGB"}
2	087	093	string | "CMYK"
3	111	117	string | "cyan"
3	119	128	string | "magenta"
3	130	138	string | "yellow"
3	140	147	string | "black"
2	109	149	array  | ["cyan","magenta","yellow","black"]
1	073	153	object | {"colors":["cyan","magenta","yellow","black"],"desc":"CMYK"}
0	000	155	array  | [{"colors":["red","green","blue"],"desc":"RGB"},{"colors":["cyan","magenta","yellow","black"],"desc":"CMYK"}]

Options

Opt Description
-d <n> emit values at depth n. if n < 0, all values will be emitted
-kv output inner key value pairs as newly formed objects
-v output depth and offset details for each value
-h display help dialog

Benchmarks

Obligatory benchmarks performed on files with arrays of objects, where the decoded objects are to be extracted.

Two file sizes are used -- regular (1.6mb, 1000 objects) and large (128mb, 100000 objects)

input size lib MB/s Allocated
regular standard 97 3.6MB
regular jstream 175 2.1MB
large standard 92 305MB
large jstream 404 69MB

In a real world scenario, including initialization and reader overhead from varying blob sizes, performance can be expected as below: jstream

More Repositories

1

ctop

Top-like interface for container metrics
Go
15,543
star
2

grmon

Command line monitoring for goroutines
Go
1,897
star
3

slackcat

CLI utility to post files and command output to slack
Go
1,218
star
4

wikitables

Import tables from any Wikipedia article as a dataset in Python
Python
290
star
5

docker-replay

Generate docker commands to rerun existing containers
Python
197
star
6

go-haproxy

Go library for interacting with HAProxy via command socket
Go
124
star
7

slack-progress

A realtime progress bar for Slack
Python
99
star
8

vim-vice

Dark and vibrant colorscheme for vim
Vim Script
95
star
9

tinycron

A very small replacement for cron
Go
84
star
10

go-units

Go library for converting between various units of measurement
Go
81
star
11

tcolors

Commandline color picker and palette builder
Go
51
star
12

xiny

Simple command line tool for unit conversions
Go
42
star
13

statsquid

🐳 Multi-host container stat aggregator and shipper for Docker
Python
36
star
14

haproxy-stats

haproxy-stats is a small Python library for fetching and parsing stats
Python
30
star
15

termui

Golang terminal dashboard (fork of gizak/termui)
Go
16
star
16

vim-jfmt

Automatically pretty-print and indent JSON files
Vim Script
13
star
17

vimcommands

Website for vimcommands.com
HTML
11
star
18

devpi-tools

Small Python library for interacting with devpi servers via web API
Python
10
star
19

somacli

🎵 Commandline SomaFM internet radio player
Shell
9
star
20

acrophone

Easily convert text to phonetic spelling
Go
8
star
21

cliglobe

A simple spinning commandline globe with gradient colors
Go
6
star
22

dsplice

Docker image merge tool
Python
6
star
23

bfstree

Go package providing breadth-first search functions for arbitrary structs
Go
5
star
24

docker-port-scan

Docker image build providing regular port scan reports via a web interface
Shell
5
star
25

color

Color package for Go
Go
5
star
26

uptime

Uptime is a concurrent, distributed URL checker
Python
4
star
27

slackn

Batch Nagios notifications for Slack
Python
3
star
28

haproxy-top

CLI tool for viewing real-time HAProxy metrics across multiple instances
Python
3
star
29

etcd-discovery

Simple container for running your own local etcd discovery service like https://discovery.etcd.io
Shell
3
star
30

dddnsupdate

dddnsupdate is a small CLI utility to dynamically nsupdate a bind server with discovered docker names and IPs
Python
2
star
31

tagshell

Execute ssh commands to multiple hosts in parallel based on arbitary tags
Python
2
star
32

tzdata

Embedded timezone database for Go
Go
2
star
33

dockertop

A top-like monitor for Docker containers written in Python
Python
2
star
34

multicrane

Multicrane - Superbly simple multi-host Docker orchestration via Crane
Python
2
star
35

haproxyview

Simple web interface for aggregating and displaying HAproxy servers and stats.
HTML
1
star
36

redis-scraper

Dump all lists in redis to flat files
Python
1
star
37

gem2deb

docker container to fetch a gem and build it as a deb package.
Shell
1
star
38

safertar

A safer way to extract tar archives using fakeroot and chroot
Shell
1
star
39

dockerfile-npm-lazy

npm_lazy caching npm registry layer in docker container
JavaScript
1
star
40

py2deb

Docker image to build a deb from Python package
Shell
1
star