Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/ohler55/ojg
Optimized JSON for Go
https://github.com/ohler55/ojg
fast golang json jsonpath parser
Last synced: 13 days ago
JSON representation
Optimized JSON for Go
- Host: GitHub
- URL: https://github.com/ohler55/ojg
- Owner: ohler55
- License: mit
- Created: 2020-04-12T17:17:31.000Z (over 4 years ago)
- Default Branch: develop
- Last Pushed: 2024-09-15T15:24:33.000Z (about 2 months ago)
- Last Synced: 2024-10-04T09:53:38.684Z (about 1 month ago)
- Topics: fast, golang, json, jsonpath, parser
- Language: Go
- Size: 1.3 MB
- Stars: 843
- Watchers: 9
- Forks: 50
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- Funding: .github/FUNDING.yml
- License: LICENSE
Awesome Lists containing this project
- awesome-go - OjG - Optimized JSON for Go is a high performance parser with a variety of additional JSON tools including JSONPath. (JSON / Search and Analytic Databases)
- awesome-json - ojg - A collection of high performance JSON processing and generating tool. (Libraries)
- awesome-go-extra - ojg - 04-12T17:17:31Z|2022-08-12T00:37:21Z| (JSON / Advanced Console UIs)
README
# [![{}j](assets/ojg_comet.svg)](https://github.com/ohler55/ojg)
[![Build Status](https://github.com/ohler55/ojg/actions/workflows/CI.yml/badge.svg)](https://github.com/ohler55/ojg/actions)
[![Coverage Status](https://coveralls.io/repos/github/ohler55/ojg/badge.svg?branch=master)](https://coveralls.io/github/ohler55/ojg?branch=master)
[![Go Report Card](https://goreportcard.com/badge/github.com/ohler55/ojg)](https://goreportcard.com/report/github.com/ohler55/ojg)Optimized JSON for Go is a high performance parser with a variety of
additional JSON tools. OjG is optimized to processing huge data sets
where data does not necessarily conform to a fixed structure.## Features
- Fast JSON parser. Check out the cmd/benchmarks app in this repo.
- Full JSONPath implemenation that operates on simple types as well as structs.
- Generic types. Not the proposed golang generics but type safe JSON elements.
- Fast JSON validator (7 times faster with io.Reader).
- Fast JSON writer with a sort option (4 times faster).
- JSON builder from JSON sources using a simple assembly plan.
- Simple data builders using a push and pop approach.
- Object encoding and decoding using an approach similar to that used with Oj for Ruby.
- [Simple Encoding Notation](sen.md), a lazy way to write JSON omitting commas and quotes.## Using
A basic Parse:
```golang
obj, err := oj.ParseString(`{
"a":[
{"x":1,"y":2,"z":3},
{"x":2,"y":4,"z":6}
]
}`)
```Using JSONPath expressions:
```golang
x, err := jp.ParseString("a[?(@.x > 1)].y")
ys := x.Get(obj)
// returns [4]
```The **oj** command (cmd/oj) uses JSON path for filtering and
extracting JSON elements. It also includes sorting, reformatting, and
colorizing options.```
$ oj -m "(@.name == 'Pete')" myfile.json```
More complete examples are available in the go docs for most
functions. The example for [Unmarshalling
interfaces](oj/example_interface_test.go) demonstrates a feature that
allows interfaces to be marshalled and unmarshalled.## Installation
```
go get github.com/ohler55/ojg
go get github.com/ohler55/ojg/cmd/oj```
or just import in your `.go` files.
```
import (
"github.com/ohler55/ojg/alt"
"github.com/ohler55/ojg/asm"
"github.com/ohler55/ojg/gen"
"github.com/ohler55/ojg/jp"
"github.com/ohler55/ojg/oj"
"github.com/ohler55/ojg/sen"
)
```To build and install the `oj` application:
```
go install ./...
```The `oj` application can be installed with brew.
```
brew install oj
```## Benchmarks
Higher numbers (longer bars) are better.
```
Parse string/[]byte
json.Unmarshal 55916 ns/op 17776 B/op 334 allocs/op
oj.Parse 39570 ns/op 18488 B/op 429 allocs/op
oj-reuse.Parse 17881 ns/op 5691 B/op 364 allocs/opoj-reuse.Parse █████████████████████▉ 3.13
oj.Parse █████████▉ 1.41
json.Unmarshal ▓▓▓▓▓▓▓ 1.00Parse io.Reader
json.Decode 63029 ns/op 32449 B/op 344 allocs/op
oj.ParseReader 34289 ns/op 22583 B/op 430 allocs/op
oj-reuse.ParseReader 25094 ns/op 9788 B/op 365 allocs/op
oj.TokenizeLoad 13610 ns/op 6072 B/op 157 allocs/opoj.TokenizeLoad ████████████████████████████████▍ 4.63
oj-reuse.ParseReader █████████████████▌ 2.51
oj.ParseReader ████████████▊ 1.84
json.Decode ▓▓▓▓▓▓▓ 1.00to JSON with indentation
json.Marshal 78762 ns/op 26978 B/op 352 allocs/op
oj.JSON 7662 ns/op 0 B/op 0 allocs/op
sen.Bytes 9053 ns/op 0 B/op 0 allocs/opoj.JSON ███████████████████████████████████████████████████████████████████████▉ 10.28
sen.Bytes ████████████████████████████████████████████████████████████▉ 8.70
json.Marshal ▓▓▓▓▓▓▓ 1.00
```See [all benchmarks](benchmarks.md)
[Compare Go JSON parsers](https://github.com/ohler55/compare-go-json)
## Releases
See [CHANGELOG.md](CHANGELOG.md)
## Links
- *Documentation*: [https://pkg.go.dev/github.com/ohler55/ojg](https://pkg.go.dev/github.com/ohler55/ojg)
- *GitHub* *repo*: https://github.com/ohler55/ojg
- *JSONPath* draft specification: https://datatracker.ietf.org/doc/draft-ietf-jsonpath-base
- *JSONPath Comparisons*: https://cburgmer.github.io/json-path-comparison
- *Go Report Card*: https://goreportcard.com/report/github.com/ohler55/ojg
#### Links of Interest
- *Oj, a Ruby JSON parser*: http://www.ohler.com/oj/doc/index.html also at https://github.com/ohler55/oj
- *OjC, a C JSON parser*: http://www.ohler.com/ojc/doc/index.html also at https://github.com/ohler55/ojc
- *Fast XML parser and marshaller on GitHub*: https://github.com/ohler55/ox
- *Agoo, a high performance Ruby web server supporting GraphQL on GitHub*: https://github.com/ohler55/agoo
- *Agoo-C, a high performance C web server supporting GraphQL on GitHub*: https://github.com/ohler55/agoo-c
#### Contributing
+ Provide a Pull Request off the `develop` branch.
+ Report a bug
+ Suggest an idea