jsonq

package module
v1.1.1 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 14, 2020 License: MIT Imports: 7 Imported by: 0

README

jsonq

Build Status

  • A json query library written in golang
Function
  • Select object and array by tokens
  • Select by selectors (jsonq version)
  • Return a multi-layers object (only support to return an array now)
Install
# use go get
go get github.com/Aoi-hosizora/jsonq

# use go mod
# import "github.com/Aoi-hosizora/jsonq"
go mod tidy
Usage
doc, err := jsonq.NewJsonDocument(objDoc)
if err != nil {
    log.Fatalln(err)
}
jq := jsonq.NewJsonQuery(doc)

// m[1]
val, err := jq.Select(1)
// m[:]
val, err := jq.Strings(jsonq.All()) // *
// m[len(m)-2][0]
val, err := jq.Int64(-2, 0)
// m["a"]["0"]["b"]
val, err := jq.Select("a", "0", "b")
// m["a"][0]["b"][0:2]
val, err := jq.Select("a", 0, "b", jsonq.Multi(0, 1)) // #0+#1
// m[1]["*"]["a"]["2"][0/2][:]
val, err := jq.SelectBySelector("#1 \\* a 2 #0+#2 *")
Selector
  • A convenient language to select json
  • Grammar definition
selector := mtok        // multi token

mtok     := mtok mtok   // the next layer
mtok     := *           // all fields in the current layer
mtok     := mtok+stok   // multiple fields in the current layer
mtok     := stok        // single token
stok     := token       // string or number

token    := #numbers    // array index
token    := strings     // map key
  • Rules: (WS means whitespace)
    • use WS to split layers
    • use + to split fields
    • use * to represent all fields (could not use with +)
    • use \ to escape all tokens (especially for WS + # *)
    • use #numbers as an array index (token start with #)
    • use raw number and other string as a map field name
    • if a field name starts with # or *, use \# and \* (if # and * is inside string, it is not necessary to escape)
    • if a field name includes a WS or +, use \WS and \+
  • Example
token1 #2 token3+token4 #5+#6 token7\ \+\ 8 9 #10 \#0# #-1
-> "token1", 2, {"token3", "token4"}, {5, 6}, "token7 + 8", "9", 10, "#0#", -1

123123 #000 \\456 \789 \##### * \* \\**\\*+\**\\*+\*+\#+\##\#
-> "123123", 0, "\456", "789", "#####", *, "*", {"*\*", "**\*", "*", "#", "###"}

0 #1 #2+#3 #4+#5+#6 \#+#0+\###\++\#+\+##
-> "0", 1, {2, 3}, {4, 5, 6}, {"#", 0, "###+", "#", "+##"}
References

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func All

func All() *starToken

Build a selector which will select all fields in the same layer.

func Multi

func Multi(tokens ...interface{}) *multiToken

Build a multiple selector which will select multiple fields in the same layer.

Types

type JsonDocument

type JsonDocument struct {
	// contains filtered or unexported fields
}

Parse json string first for json query.

func NewJsonDocument

func NewJsonDocument(data []byte) (*JsonDocument, error)

Create a JsonDocument, handle json string first (`{` or `[`).

type JsonQuery

type JsonQuery struct {
	// contains filtered or unexported fields
}

Query json fields.

func NewJsonQuery

func NewJsonQuery(doc *JsonDocument) *JsonQuery

Create a JsonQuery to query json.

func (*JsonQuery) Array

func (j *JsonQuery) Array(tokens ...interface{}) ([]interface{}, error)

func (*JsonQuery) ArrayBySelector

func (j *JsonQuery) ArrayBySelector(selectorString string) ([]interface{}, error)

func (*JsonQuery) Arrays

func (j *JsonQuery) Arrays(tokens ...interface{}) ([][]interface{}, error)

func (*JsonQuery) ArraysBySelector

func (j *JsonQuery) ArraysBySelector(selector string) ([][]interface{}, error)

func (*JsonQuery) Bool

func (j *JsonQuery) Bool(tokens ...interface{}) (bool, error)

func (*JsonQuery) BoolBySelector

func (j *JsonQuery) BoolBySelector(selectorString string) (bool, error)

func (*JsonQuery) Bools

func (j *JsonQuery) Bools(tokens ...interface{}) ([]bool, error)

func (*JsonQuery) BoolsBySelector

func (j *JsonQuery) BoolsBySelector(selector string) ([]bool, error)

func (*JsonQuery) Float64

func (j *JsonQuery) Float64(tokens ...interface{}) (float64, error)

func (*JsonQuery) Float64BySelector

func (j *JsonQuery) Float64BySelector(selectorString string) (float64, error)

func (*JsonQuery) Float64s

func (j *JsonQuery) Float64s(tokens ...interface{}) ([]float64, error)

func (*JsonQuery) Float64sBySelector

func (j *JsonQuery) Float64sBySelector(selector string) ([]float64, error)

func (*JsonQuery) Int64

func (j *JsonQuery) Int64(tokens ...interface{}) (int64, error)

func (*JsonQuery) Int64BySelector

func (j *JsonQuery) Int64BySelector(selectorString string) (int64, error)

func (*JsonQuery) Int64s

func (j *JsonQuery) Int64s(tokens ...interface{}) ([]int64, error)

func (*JsonQuery) Int64sBySelector

func (j *JsonQuery) Int64sBySelector(selector string) ([]int64, error)

func (*JsonQuery) Object

func (j *JsonQuery) Object(tokens ...interface{}) (map[string]interface{}, error)

func (*JsonQuery) ObjectBySelector

func (j *JsonQuery) ObjectBySelector(selectorString string) (map[string]interface{}, error)

func (*JsonQuery) Objects

func (j *JsonQuery) Objects(tokens ...interface{}) ([]map[string]interface{}, error)

func (*JsonQuery) ObjectsBySelector

func (j *JsonQuery) ObjectsBySelector(selector string) ([]map[string]interface{}, error)

func (*JsonQuery) Select

func (j *JsonQuery) Select(tokens ...interface{}) (interface{}, error)

Query json by a slice of strings / integers / MultiTokens.

func (*JsonQuery) SelectBySelector

func (j *JsonQuery) SelectBySelector(selectorString string) (interface{}, error)

Query json by a selector string.

func (*JsonQuery) String

func (j *JsonQuery) String(tokens ...interface{}) (string, error)

func (*JsonQuery) StringBySelector

func (j *JsonQuery) StringBySelector(selectorString string) (string, error)

func (*JsonQuery) Strings

func (j *JsonQuery) Strings(tokens ...interface{}) ([]string, error)

func (*JsonQuery) StringsBySelector

func (j *JsonQuery) StringsBySelector(selector string) ([]string, error)

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL