...

Package ast

import "github.com/bytedance/sonic/ast"
Overview
Index

Overview ▾

Index ▾

Constants
Variables
func Loads(src string) (int, interface{}, error)
func LoadsUseNumber(src string) (int, interface{}, error)
func Preorder(str string, visitor Visitor, opts *VisitorOptions) error
type Iterator
    func (self *Iterator) HasNext() bool
    func (self *Iterator) Len() int
    func (self *Iterator) Pos() int
type ListIterator
    func (self *ListIterator) Next(v *Node) bool
type Node
    func NewAny(any interface{}) Node
    func NewArray(v []Node) Node
    func NewBool(v bool) Node
    func NewBytes(src []byte) Node
    func NewNull() Node
    func NewNumber(v string) Node
    func NewObject(v []Pair) Node
    func NewRaw(json string) Node
    func NewString(v string) Node
    func (self *Node) Add(node Node) error
    func (self *Node) AddAny(val interface{}) error
    func (self *Node) Array() ([]interface{}, error)
    func (self *Node) ArrayUseNode() ([]Node, error)
    func (self *Node) ArrayUseNumber() ([]interface{}, error)
    func (self *Node) Bool() (bool, error)
    func (self *Node) Cap() (int, error)
    func (self *Node) Check() error
    func (self Node) Error() string
    func (self *Node) Exists() bool
    func (self *Node) Float64() (float64, error)
    func (self *Node) ForEach(sc Scanner) error
    func (self *Node) Get(key string) *Node
    func (self *Node) GetByPath(path ...interface{}) *Node
    func (self *Node) Index(idx int) *Node
    func (self *Node) IndexOrGet(idx int, key string) *Node
    func (self *Node) IndexPair(idx int) *Pair
    func (self *Node) Int64() (int64, error)
    func (self *Node) Interface() (interface{}, error)
    func (self *Node) InterfaceUseNode() (interface{}, error)
    func (self *Node) InterfaceUseNumber() (interface{}, error)
    func (self Node) IsRaw() bool
    func (self *Node) Len() (int, error)
    func (self *Node) Load() error
    func (self *Node) LoadAll() error
    func (self *Node) Map() (map[string]interface{}, error)
    func (self *Node) MapUseNode() (map[string]Node, error)
    func (self *Node) MapUseNumber() (map[string]interface{}, error)
    func (self *Node) MarshalJSON() ([]byte, error)
    func (self *Node) Move(dst, src int) error
    func (self *Node) Number() (json.Number, error)
    func (self *Node) Pop() error
    func (self *Node) Properties() (ObjectIterator, error)
    func (self *Node) Raw() (string, error)
    func (self *Node) Set(key string, node Node) (bool, error)
    func (self *Node) SetAny(key string, val interface{}) (bool, error)
    func (self *Node) SetAnyByIndex(index int, val interface{}) (bool, error)
    func (self *Node) SetByIndex(index int, node Node) (bool, error)
    func (self *Node) SortKeys(recurse bool) error
    func (self *Node) StrictFloat64() (float64, error)
    func (self *Node) StrictInt64() (int64, error)
    func (self *Node) StrictNumber() (json.Number, error)
    func (self *Node) StrictString() (string, error)
    func (self *Node) String() (string, error)
    func (self Node) Type() int
    func (self *Node) UnmarshalJSON(data []byte) (err error)
    func (self *Node) Unset(key string) (bool, error)
    func (self *Node) UnsetByIndex(index int) (bool, error)
    func (self *Node) Valid() bool
    func (self *Node) Values() (ListIterator, error)
type ObjectIterator
    func (self *ObjectIterator) Next(p *Pair) bool
type Pair
type Parser
    func NewParser(src string) *Parser
    func NewParserObj(src string) Parser
    func (self *Parser) ExportError(err types.ParsingError) error
    func (self *Parser) Parse() (Node, types.ParsingError)
    func (self *Parser) Pos() int
type Scanner
type Searcher
    func NewSearcher(str string) *Searcher
    func (self *Searcher) GetByPath(path ...interface{}) (Node, error)
    func (self *Searcher) GetByPathCopy(path ...interface{}) (Node, error)
type Sequence
    func (s Sequence) String() string
type SyntaxError
    func (self SyntaxError) Description() string
    func (self SyntaxError) Error() string
    func (self SyntaxError) Message() string
type Visitor
type VisitorOptions

Package files

api_amd64.go buffer.go decode.go encode.go error.go iterator.go node.go parser.go search.go stubs_go120.go visitor.go

Constants

const (
    V_NONE   = 0
    V_ERROR  = 1
    V_NULL   = int(types.V_NULL)
    V_TRUE   = int(types.V_TRUE)
    V_FALSE  = int(types.V_FALSE)
    V_ARRAY  = int(types.V_ARRAY)
    V_OBJECT = int(types.V_OBJECT)
    V_STRING = int(types.V_STRING)
    V_NUMBER = int(_V_NUMBER)
    V_ANY    = int(_V_ANY)
)

Variables

var (
    // ErrNotExist means both key and value doesn't exist
    ErrNotExist error = newError(_ERR_NOT_FOUND, "value not exists")

    // ErrUnsupportType means API on the node is unsupported
    ErrUnsupportType error = newError(_ERR_UNSUPPORT_TYPE, "unsupported type")
)

func Loads

func Loads(src string) (int, interface{}, error)

Loads parse all json into interface{}

func LoadsUseNumber

func LoadsUseNumber(src string) (int, interface{}, error)

LoadsUseNumber parse all json into interface{}, with numeric nodes casted to json.Number

func Preorder

func Preorder(str string, visitor Visitor, opts *VisitorOptions) error

Preorder decodes the whole JSON string and callbacks each AST node to visitor during preorder traversal. Any visitor method with an error returned will break the traversal and the given error will be directly returned. The opts argument can be reused after every call.

type Iterator

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

func (*Iterator) HasNext

func (self *Iterator) HasNext() bool

HasNext reports if it is the end of iteration or has error.

func (*Iterator) Len

func (self *Iterator) Len() int

func (*Iterator) Pos

func (self *Iterator) Pos() int

type ListIterator

ListIterator is specialized iterator for V_ARRAY

type ListIterator struct {
    Iterator
}

func (*ListIterator) Next

func (self *ListIterator) Next(v *Node) bool

Next scans through children of underlying V_ARRAY, copies each child to v, and returns .HasNext().

type Node

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

func NewAny

func NewAny(any interface{}) Node

NewAny creates a node of type V_ANY if any's type isn't Node or *Node, which stores interface{} and can be only used for `.Interface()`\`.MarshalJSON()`.

func NewArray

func NewArray(v []Node) Node

NewArray creates a node of type V_ARRAY, using v as its underlying children

func NewBool

func NewBool(v bool) Node

NewBool creates a node of type bool:

If v is true, returns V_TRUE node
If v is false, returns V_FALSE node

func NewBytes

func NewBytes(src []byte) Node

NewBytes encodes given src with Base64 (RFC 4648), and creates a node of type V_STRING.

func NewNull

func NewNull() Node

NewNull creates a node of type V_NULL

func NewNumber

func NewNumber(v string) Node

NewNumber creates a json.Number node v must be a decimal string complying with RFC8259

func NewObject

func NewObject(v []Pair) Node

NewObject creates a node of type V_OBJECT, using v as its underlying children

func NewRaw

func NewRaw(json string) Node

NewRaw creates a node of raw json. If the input json is invalid, NewRaw returns a error Node.

func NewString

func NewString(v string) Node

NewString creates a node of type V_STRING. v is considered to be a valid UTF-8 string, which means it won't be validated and unescaped. when the node is encoded to json, v will be escaped.

func (*Node) Add

func (self *Node) Add(node Node) error

Add appends the given node under self.

If self is V_NONE or V_NULL, it becomes V_ARRAY and sets the node at index 0.

func (*Node) AddAny

func (self *Node) AddAny(val interface{}) error

SetAny wraps val with V_ANY node, and Add() the node.

func (*Node) Array

func (self *Node) Array() ([]interface{}, error)

Array loads all indexes of an array node

func (*Node) ArrayUseNode

func (self *Node) ArrayUseNode() ([]Node, error)

ArrayUseNode copys both parsed and non-parsed chidren nodes, and indexes them by original order

func (*Node) ArrayUseNumber

func (self *Node) ArrayUseNumber() ([]interface{}, error)

ArrayUseNumber loads all indexes of an array node, with numeric nodes casted to json.Number

func (*Node) Bool

func (self *Node) Bool() (bool, error)

Bool returns bool value represented by this node, including types.V_TRUE|V_FALSE|V_NUMBER|V_STRING|V_ANY|V_NULL, V_NONE will return error

func (*Node) Cap

func (self *Node) Cap() (int, error)

Cap returns malloc capacity of a array|object node for children

func (*Node) Check

func (self *Node) Check() error

Check checks if the node itself is valid, and return:

func (Node) Error

func (self Node) Error() string

Error returns error message if the node is invalid

func (*Node) Exists

func (self *Node) Exists() bool

Exists returns false only if the self is nil or empty node V_NONE

func (*Node) Float64

func (self *Node) Float64() (float64, error)

Float64 cast node to float64, including V_NUMBER|V_TRUE|V_FALSE|V_ANY|V_STRING|V_NULL, V_NONE it will return error

func (*Node) ForEach

func (self *Node) ForEach(sc Scanner) error

ForEach scans one V_OBJECT node's children from JSON head to tail, and pass the Sequence and Node of corresponding JSON value.

Especailly, if the node is not V_ARRAY or V_OBJECT, the node itself will be returned and Sequence.Index == -1.

NOTICE: A unsetted node WON'T trigger sc, but its index still counts into Path.Index

func (*Node) Get

func (self *Node) Get(key string) *Node

Get loads given key of an object node on demands

func (*Node) GetByPath

func (self *Node) GetByPath(path ...interface{}) *Node

GetByPath load given path on demands, which only ensure nodes before this path got parsed.

Note, the api expects the json is well-formed at least, otherwise it may return unexpected result.

func (*Node) Index

func (self *Node) Index(idx int) *Node

Index indexies node at given idx, node type CAN be either V_OBJECT or V_ARRAY

func (*Node) IndexOrGet

func (self *Node) IndexOrGet(idx int, key string) *Node

IndexOrGet firstly use idx to index a value and check if its key matches If not, then use the key to search value

func (*Node) IndexPair

func (self *Node) IndexPair(idx int) *Pair

IndexPair indexies pair at given idx, node type MUST be either V_OBJECT

func (*Node) Int64

func (self *Node) Int64() (int64, error)

Int64 casts the node to int64 value, including V_NUMBER|V_TRUE|V_FALSE|V_ANY|V_STRING V_NONE it will return error

func (*Node) Interface

func (self *Node) Interface() (interface{}, error)

Interface loads all children under all pathes from this node, and converts itself as generic type. WARN: all numberic nodes are casted to float64

func (*Node) InterfaceUseNode

func (self *Node) InterfaceUseNode() (interface{}, error)

InterfaceUseNode clone itself as a new node, or its children as map[string]Node (or []Node)

func (*Node) InterfaceUseNumber

func (self *Node) InterfaceUseNumber() (interface{}, error)

InterfaceUseNumber works same with Interface() except numberic nodes are casted to json.Number

func (Node) IsRaw

func (self Node) IsRaw() bool

IsRaw returns true if node's underlying value is raw json

func (*Node) Len

func (self *Node) Len() (int, error)

Len returns children count of a array|object|string node WARN: For partially loaded node, it also works but only counts the parsed children

func (*Node) Load

func (self *Node) Load() error

Load loads the node's children as parsed. After calling it, only the node itself can be used on concurrency (not include its children)

func (*Node) LoadAll

func (self *Node) LoadAll() error

LoadAll loads all the node's children and children's children as parsed. After calling it, the node can be safely used on concurrency

func (*Node) Map

func (self *Node) Map() (map[string]interface{}, error)

Map loads all keys of an object node

func (*Node) MapUseNode

func (self *Node) MapUseNode() (map[string]Node, error)

MapUseNode scans both parsed and non-parsed chidren nodes, and map them by their keys

func (*Node) MapUseNumber

func (self *Node) MapUseNumber() (map[string]interface{}, error)

MapUseNumber loads all keys of an object node, with numeric nodes casted to json.Number

func (*Node) MarshalJSON

func (self *Node) MarshalJSON() ([]byte, error)

func (*Node) Move

func (self *Node) Move(dst, src int) error

Move moves the child at src index to dst index, meanwhile slides sliblings from src+1 to dst.

WARN: this will change address of elements, which is a dangerous action.

func (*Node) Number

func (self *Node) Number() (json.Number, error)

Number casts node to float64, including V_NUMBER|V_TRUE|V_FALSE|V_ANY|V_STRING|V_NULL, V_NONE it will return error

func (*Node) Pop

func (self *Node) Pop() error

Pop remove the last child of the V_Array or V_Object node.

func (*Node) Properties

func (self *Node) Properties() (ObjectIterator, error)

Properties returns iterator for object's children traversal

func (*Node) Raw

func (self *Node) Raw() (string, error)

Raw returns json representation of the node,

func (*Node) Set

func (self *Node) Set(key string, node Node) (bool, error)

Set sets the node of given key under self, and reports if the key has existed.

If self is V_NONE or V_NULL, it becomes V_OBJECT and sets the node at the key.

func (*Node) SetAny

func (self *Node) SetAny(key string, val interface{}) (bool, error)

SetAny wraps val with V_ANY node, and Set() the node.

func (*Node) SetAnyByIndex

func (self *Node) SetAnyByIndex(index int, val interface{}) (bool, error)

SetAny wraps val with V_ANY node, and SetByIndex() the node.

func (*Node) SetByIndex

func (self *Node) SetByIndex(index int, node Node) (bool, error)

SetByIndex sets the node of given index, and reports if the key has existed.

The index must be within self's children.

func (*Node) SortKeys

func (self *Node) SortKeys(recurse bool) error

SortKeys sorts children of a V_OBJECT node in ascending key-order. If recurse is true, it recursively sorts children's children as long as a V_OBJECT node is found.

func (*Node) StrictFloat64

func (self *Node) StrictFloat64() (float64, error)

Float64 exports underlying float64 value, includeing V_NUMBER, V_ANY

func (*Node) StrictInt64

func (self *Node) StrictInt64() (int64, error)

StrictInt64 exports underlying int64 value, including V_NUMBER, V_ANY

func (*Node) StrictNumber

func (self *Node) StrictNumber() (json.Number, error)

Number exports underlying float64 value, including V_NUMBER, V_ANY of json.Number

func (*Node) StrictString

func (self *Node) StrictString() (string, error)

StrictString returns string value (unescaped), includeing V_STRING, V_ANY of string. In other cases, it will return empty string.

func (*Node) String

func (self *Node) String() (string, error)

String cast node to string, including V_NUMBER|V_TRUE|V_FALSE|V_ANY|V_STRING|V_NULL, V_NONE it will return error

func (Node) Type

func (self Node) Type() int

Type returns json type represented by the node It will be one of belows:

V_NONE   = 0 (empty node, key not exists)
V_ERROR  = 1 (error node)
V_NULL   = 2 (json value `null`, key exists)
V_TRUE   = 3 (json value `true`)
V_FALSE  = 4 (json value `false`)
V_ARRAY  = 5 (json value array)
V_OBJECT = 6 (json value object)
V_STRING = 7 (json value string)
V_NUMBER = 33 (json value number )
V_ANY    = 34 (golang interface{})

func (*Node) UnmarshalJSON

func (self *Node) UnmarshalJSON(data []byte) (err error)

UnmarshalJSON is just an adapter to json.Unmarshaler. If you want better performance, use Searcher.GetByPath() directly

func (*Node) Unset

func (self *Node) Unset(key string) (bool, error)

Unset REMOVE (soft) the node of given key under object parent, and reports if the key has existed.

func (*Node) UnsetByIndex

func (self *Node) UnsetByIndex(index int) (bool, error)

UnsetByIndex REOMVE (softly) the node of given index.

WARN: this will change address of elements, which is a dangerous action. Use Unset() for object or Pop() for array instead.

func (*Node) Valid

func (self *Node) Valid() bool

Valid reports if self is NOT V_ERROR or nil

func (*Node) Values

func (self *Node) Values() (ListIterator, error)

Values returns iterator for array's children traversal

type ObjectIterator

ObjectIterator is specialized iterator for V_ARRAY

type ObjectIterator struct {
    Iterator
}

func (*ObjectIterator) Next

func (self *ObjectIterator) Next(p *Pair) bool

Next scans through children of underlying V_OBJECT, copies each child to v, and returns .HasNext().

type Pair

type Pair struct {
    Key   string
    Value Node
}

type Parser

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

func NewParser

func NewParser(src string) *Parser

NewParser returns pointer of new allocated parser

func NewParserObj

func NewParserObj(src string) Parser

NewParser returns new allocated parser

func (*Parser) ExportError

func (self *Parser) ExportError(err types.ParsingError) error

ExportError converts types.ParsingError to std Error

func (*Parser) Parse

func (self *Parser) Parse() (Node, types.ParsingError)

func (*Parser) Pos

func (self *Parser) Pos() int

type Scanner

type Scanner func(path Sequence, node *Node) bool

type Searcher

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

func NewSearcher

func NewSearcher(str string) *Searcher

func (*Searcher) GetByPath

func (self *Searcher) GetByPath(path ...interface{}) (Node, error)

GetByPathNoCopy search in depth from top json and returns a **Referenced** json node at the path location

WARN: this search directly refer partial json from top json, which has faster speed, may consumes more memory.

func (*Searcher) GetByPathCopy

func (self *Searcher) GetByPathCopy(path ...interface{}) (Node, error)

GetByPathCopy search in depth from top json and returns a **Copied** json node at the path location

type Sequence

Sequence represents scanning path of single-layer nodes. Index indicates the value's order in both V_ARRAY and V_OBJECT json. Key is the value's key (for V_OBJECT json only, otherwise it will be nil).

type Sequence struct {
    Index int
    Key   *string
}

func (Sequence) String

func (s Sequence) String() string

String is string representation of one Sequence

type SyntaxError

type SyntaxError struct {
    Pos  int
    Src  string
    Code types.ParsingError
    Msg  string
}

func (SyntaxError) Description

func (self SyntaxError) Description() string

func (SyntaxError) Error

func (self SyntaxError) Error() string

func (SyntaxError) Message

func (self SyntaxError) Message() string

type Visitor

Visitor handles the callbacks during preorder traversal of a JSON AST.

According to the JSON RFC8259, a JSON AST can be defined by the following rules without seperator / whitespace tokens.

JSON-AST  = value
value     = false / null / true / object / array / number / string
object    = begin-object [ member *( member ) ] end-object
member    = string value
array     = begin-array [ value *( value ) ] end-array
type Visitor interface {

    // OnNull handles a JSON null value.
    OnNull() error

    // OnBool handles a JSON true / false value.
    OnBool(v bool) error

    // OnString handles a JSON string value.
    OnString(v string) error

    // OnInt64 handles a JSON number value with int64 type.
    OnInt64(v int64, n json.Number) error

    // OnFloat64 handles a JSON number value with float64 type.
    OnFloat64(v float64, n json.Number) error

    // OnObjectBegin handles the beginning of a JSON object value with a
    // suggested capacity that can be used to make your custom object container.
    //
    // After this point the visitor will receive a sequence of callbacks like
    // [string, value, string, value, ......, ObjectEnd].
    //
    // Note:
    // 1. This is a recursive definition which means the value can
    // also be a JSON object / array described by a sequence of callbacks.
    // 2. The suggested capacity will be 0 if current object is empty.
    // 3. Currently sonic use a fixed capacity for non-empty object (keep in
    // sync with ast.Node) which might not be very suitable. This may be
    // improved in future version.
    OnObjectBegin(capacity int) error

    // OnObjectKey handles a JSON object key string in member.
    OnObjectKey(key string) error

    // OnObjectEnd handles the ending of a JSON object value.
    OnObjectEnd() error

    // OnArrayBegin handles the beginning of a JSON array value with a
    // suggested capacity that can be used to make your custom array container.
    //
    // After this point the visitor will receive a sequence of callbacks like
    // [value, value, value, ......, ArrayEnd].
    //
    // Note:
    // 1. This is a recursive definition which means the value can
    // also be a JSON object / array described by a sequence of callbacks.
    // 2. The suggested capacity will be 0 if current array is empty.
    // 3. Currently sonic use a fixed capacity for non-empty array (keep in
    // sync with ast.Node) which might not be very suitable. This may be
    // improved in future version.
    OnArrayBegin(capacity int) error

    // OnArrayEnd handles the ending of a JSON array value.
    OnArrayEnd() error
}

type VisitorOptions

VisitorOptions contains all Visitor's options. The default value is an empty VisitorOptions{}.

type VisitorOptions struct {
    // OnlyNumber indicates parser to directly return number value without
    // conversion, then the first argument of OnInt64 / OnFloat64 will always
    // be zero.
    OnlyNumber bool
}