romshark / jscan

High performance JSON iterator & validator for Go
BSD 3-Clause "New" or "Revised" License
89 stars 7 forks source link
go golang high-performance json validation

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 with backward compatibility to 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 compliant JSON parsers.

See jscan-benchmark for benchmark results ๐ŸŽ๏ธ ๐Ÿ.

Example

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

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
    }
}