.github
alerting
client
config
controller
core
docs
example
jsonpath
k8s
k8stest
metric
pattern
security
static
storage
vendor
cloud.google.com
github.com
TwinProduction
beorn7
boltdb
cespare
davecgh
go-ping
gogo
golang
google
googleapis
gorilla
imdario
json-iterator
go
.codecov.yml
.gitignore
.travis.yml
Gopkg.lock
Gopkg.toml
LICENSE
README.md
adapter.go
any.go
any_array.go
any_bool.go
any_float.go
any_int32.go
any_int64.go
any_invalid.go
any_nil.go
any_number.go
any_object.go
any_str.go
any_uint32.go
any_uint64.go
build.sh
config.go
fuzzy_mode_convert_table.md
go.mod
go.sum
iter.go
iter_array.go
iter_float.go
iter_int.go
iter_object.go
iter_skip.go
iter_skip_sloppy.go
iter_skip_strict.go
iter_str.go
jsoniter.go
pool.go
reflect.go
reflect_array.go
reflect_dynamic.go
reflect_extension.go
reflect_json_number.go
reflect_json_raw_message.go
reflect_map.go
reflect_marshaler.go
reflect_native.go
reflect_optional.go
reflect_slice.go
reflect_struct_decoder.go
reflect_struct_encoder.go
stream.go
stream_float.go
stream_int.go
stream_str.go
test.sh
matttproud
miekg
modern-go
prometheus
spf13
golang.org
google.golang.org
gopkg.in
k8s.io
sigs.k8s.io
modules.txt
watchdog
.dockerignore
.gitattributes
.gitignore
Dockerfile
LICENSE.md
README.md
config.yaml
go.mod
go.sum
main.go
151 lines
4.5 KiB
Go
151 lines
4.5 KiB
Go
package jsoniter
|
|
|
|
import (
|
|
"bytes"
|
|
"io"
|
|
)
|
|
|
|
// RawMessage to make replace json with jsoniter
|
|
type RawMessage []byte
|
|
|
|
// Unmarshal adapts to json/encoding Unmarshal API
|
|
//
|
|
// Unmarshal parses the JSON-encoded data and stores the result in the value pointed to by v.
|
|
// Refer to https://godoc.org/encoding/json#Unmarshal for more information
|
|
func Unmarshal(data []byte, v interface{}) error {
|
|
return ConfigDefault.Unmarshal(data, v)
|
|
}
|
|
|
|
// UnmarshalFromString is a convenient method to read from string instead of []byte
|
|
func UnmarshalFromString(str string, v interface{}) error {
|
|
return ConfigDefault.UnmarshalFromString(str, v)
|
|
}
|
|
|
|
// Get quick method to get value from deeply nested JSON structure
|
|
func Get(data []byte, path ...interface{}) Any {
|
|
return ConfigDefault.Get(data, path...)
|
|
}
|
|
|
|
// Marshal adapts to json/encoding Marshal API
|
|
//
|
|
// Marshal returns the JSON encoding of v, adapts to json/encoding Marshal API
|
|
// Refer to https://godoc.org/encoding/json#Marshal for more information
|
|
func Marshal(v interface{}) ([]byte, error) {
|
|
return ConfigDefault.Marshal(v)
|
|
}
|
|
|
|
// MarshalIndent same as json.MarshalIndent. Prefix is not supported.
|
|
func MarshalIndent(v interface{}, prefix, indent string) ([]byte, error) {
|
|
return ConfigDefault.MarshalIndent(v, prefix, indent)
|
|
}
|
|
|
|
// MarshalToString convenient method to write as string instead of []byte
|
|
func MarshalToString(v interface{}) (string, error) {
|
|
return ConfigDefault.MarshalToString(v)
|
|
}
|
|
|
|
// NewDecoder adapts to json/stream NewDecoder API.
|
|
//
|
|
// NewDecoder returns a new decoder that reads from r.
|
|
//
|
|
// Instead of a json/encoding Decoder, an Decoder is returned
|
|
// Refer to https://godoc.org/encoding/json#NewDecoder for more information
|
|
func NewDecoder(reader io.Reader) *Decoder {
|
|
return ConfigDefault.NewDecoder(reader)
|
|
}
|
|
|
|
// Decoder reads and decodes JSON values from an input stream.
|
|
// Decoder provides identical APIs with json/stream Decoder (Token() and UseNumber() are in progress)
|
|
type Decoder struct {
|
|
iter *Iterator
|
|
}
|
|
|
|
// Decode decode JSON into interface{}
|
|
func (adapter *Decoder) Decode(obj interface{}) error {
|
|
if adapter.iter.head == adapter.iter.tail && adapter.iter.reader != nil {
|
|
if !adapter.iter.loadMore() {
|
|
return io.EOF
|
|
}
|
|
}
|
|
adapter.iter.ReadVal(obj)
|
|
err := adapter.iter.Error
|
|
if err == io.EOF {
|
|
return nil
|
|
}
|
|
return adapter.iter.Error
|
|
}
|
|
|
|
// More is there more?
|
|
func (adapter *Decoder) More() bool {
|
|
iter := adapter.iter
|
|
if iter.Error != nil {
|
|
return false
|
|
}
|
|
c := iter.nextToken()
|
|
if c == 0 {
|
|
return false
|
|
}
|
|
iter.unreadByte()
|
|
return c != ']' && c != '}'
|
|
}
|
|
|
|
// Buffered remaining buffer
|
|
func (adapter *Decoder) Buffered() io.Reader {
|
|
remaining := adapter.iter.buf[adapter.iter.head:adapter.iter.tail]
|
|
return bytes.NewReader(remaining)
|
|
}
|
|
|
|
// UseNumber causes the Decoder to unmarshal a number into an interface{} as a
|
|
// Number instead of as a float64.
|
|
func (adapter *Decoder) UseNumber() {
|
|
cfg := adapter.iter.cfg.configBeforeFrozen
|
|
cfg.UseNumber = true
|
|
adapter.iter.cfg = cfg.frozeWithCacheReuse(adapter.iter.cfg.extraExtensions)
|
|
}
|
|
|
|
// DisallowUnknownFields causes the Decoder to return an error when the destination
|
|
// is a struct and the input contains object keys which do not match any
|
|
// non-ignored, exported fields in the destination.
|
|
func (adapter *Decoder) DisallowUnknownFields() {
|
|
cfg := adapter.iter.cfg.configBeforeFrozen
|
|
cfg.DisallowUnknownFields = true
|
|
adapter.iter.cfg = cfg.frozeWithCacheReuse(adapter.iter.cfg.extraExtensions)
|
|
}
|
|
|
|
// NewEncoder same as json.NewEncoder
|
|
func NewEncoder(writer io.Writer) *Encoder {
|
|
return ConfigDefault.NewEncoder(writer)
|
|
}
|
|
|
|
// Encoder same as json.Encoder
|
|
type Encoder struct {
|
|
stream *Stream
|
|
}
|
|
|
|
// Encode encode interface{} as JSON to io.Writer
|
|
func (adapter *Encoder) Encode(val interface{}) error {
|
|
adapter.stream.WriteVal(val)
|
|
adapter.stream.WriteRaw("\n")
|
|
adapter.stream.Flush()
|
|
return adapter.stream.Error
|
|
}
|
|
|
|
// SetIndent set the indention. Prefix is not supported
|
|
func (adapter *Encoder) SetIndent(prefix, indent string) {
|
|
config := adapter.stream.cfg.configBeforeFrozen
|
|
config.IndentionStep = len(indent)
|
|
adapter.stream.cfg = config.frozeWithCacheReuse(adapter.stream.cfg.extraExtensions)
|
|
}
|
|
|
|
// SetEscapeHTML escape html by default, set to false to disable
|
|
func (adapter *Encoder) SetEscapeHTML(escapeHTML bool) {
|
|
config := adapter.stream.cfg.configBeforeFrozen
|
|
config.EscapeHTML = escapeHTML
|
|
adapter.stream.cfg = config.frozeWithCacheReuse(adapter.stream.cfg.extraExtensions)
|
|
}
|
|
|
|
// Valid reports whether data is a valid JSON encoding.
|
|
func Valid(data []byte) bool {
|
|
return ConfigDefault.Valid(data)
|
|
}
|