Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/romshark/jscan

High performance JSON iterator & validator for Go
https://github.com/romshark/jscan

go golang high-performance json validation

Last synced: 14 days ago
JSON representation

High performance JSON iterator & validator for Go

Awesome Lists containing this project

README

        


GoDoc


GoReportCard


Coverage Status

# jscan
jscan provides high-performance zero-allocation JSON iterator and validator for Go. This module doesn't provide `Marshal`/`Unmarshal` capabilities *yet*, instead it focuses on highly efficient iteration over JSON data with on-the-fly validation.

An [experimental decoder](https://github.com/romshark/jscan-experimental-decoder) with backward compatibility to [encoding/json](https://pkg.go.dev/encoding/json) is WiP ๐Ÿงช and is expected to be introduced together with jscan v3.

jscan is tested against https://github.com/nst/JSONTestSuite, a comprehensive test suite for [RFC 8259](https://datatracker.ietf.org/doc/html/rfc8259) compliant JSON parsers.

See [jscan-benchmark](https://github.com/romshark/jscan-benchmark) for benchmark results ๐ŸŽ๏ธ ๐Ÿ.

## Example
https://go.dev/play/p/moP3l9EkebF

```go
package main

import (
"fmt"

"github.com/romshark/jscan/v2"
)

func main() {
j := `{
"s": "value",
"t": true,
"f": false,
"0": null,
"n": -9.123e3,
"o0": {},
"a0": [],
"o": {
"k": "\"v\"",
"a": [
true,
null,
"item",
-67.02e9,
["foo"]
]
},
"a3": [
0,
{
"a3.a3":8
}
]
}`

err := jscan.Scan(j, func(i *jscan.Iterator[string]) (err bool) {
fmt.Printf("%q:\n", i.Pointer())
fmt.Printf("โ”œโ”€ valueType: %s\n", i.ValueType().String())
if k := i.Key(); k != "" {
fmt.Printf("โ”œโ”€ key: %q\n", k[1:len(k)-1])
}
if ai := i.ArrayIndex(); ai != -1 {
fmt.Printf("โ”œโ”€ arrayIndex: %d\n", ai)
}
if v := i.Value(); v != "" {
fmt.Printf("โ”œโ”€ value: %q\n", v)
}
fmt.Printf("โ””โ”€ level: %d\n", i.Level())
return false // Resume scanning
})

if err.IsErr() {
fmt.Printf("ERR: %s\n", err)
return
}
}
```