podman

Форк
0
150 строк · 4.5 Кб
1
package jsoniter
2

3
import (
4
	"bytes"
5
	"io"
6
)
7

8
// RawMessage to make replace json with jsoniter
9
type RawMessage []byte
10

11
// Unmarshal adapts to json/encoding Unmarshal API
12
//
13
// Unmarshal parses the JSON-encoded data and stores the result in the value pointed to by v.
14
// Refer to https://godoc.org/encoding/json#Unmarshal for more information
15
func Unmarshal(data []byte, v interface{}) error {
16
	return ConfigDefault.Unmarshal(data, v)
17
}
18

19
// UnmarshalFromString is a convenient method to read from string instead of []byte
20
func UnmarshalFromString(str string, v interface{}) error {
21
	return ConfigDefault.UnmarshalFromString(str, v)
22
}
23

24
// Get quick method to get value from deeply nested JSON structure
25
func Get(data []byte, path ...interface{}) Any {
26
	return ConfigDefault.Get(data, path...)
27
}
28

29
// Marshal adapts to json/encoding Marshal API
30
//
31
// Marshal returns the JSON encoding of v, adapts to json/encoding Marshal API
32
// Refer to https://godoc.org/encoding/json#Marshal for more information
33
func Marshal(v interface{}) ([]byte, error) {
34
	return ConfigDefault.Marshal(v)
35
}
36

37
// MarshalIndent same as json.MarshalIndent. Prefix is not supported.
38
func MarshalIndent(v interface{}, prefix, indent string) ([]byte, error) {
39
	return ConfigDefault.MarshalIndent(v, prefix, indent)
40
}
41

42
// MarshalToString convenient method to write as string instead of []byte
43
func MarshalToString(v interface{}) (string, error) {
44
	return ConfigDefault.MarshalToString(v)
45
}
46

47
// NewDecoder adapts to json/stream NewDecoder API.
48
//
49
// NewDecoder returns a new decoder that reads from r.
50
//
51
// Instead of a json/encoding Decoder, an Decoder is returned
52
// Refer to https://godoc.org/encoding/json#NewDecoder for more information
53
func NewDecoder(reader io.Reader) *Decoder {
54
	return ConfigDefault.NewDecoder(reader)
55
}
56

57
// Decoder reads and decodes JSON values from an input stream.
58
// Decoder provides identical APIs with json/stream Decoder (Token() and UseNumber() are in progress)
59
type Decoder struct {
60
	iter *Iterator
61
}
62

63
// Decode decode JSON into interface{}
64
func (adapter *Decoder) Decode(obj interface{}) error {
65
	if adapter.iter.head == adapter.iter.tail && adapter.iter.reader != nil {
66
		if !adapter.iter.loadMore() {
67
			return io.EOF
68
		}
69
	}
70
	adapter.iter.ReadVal(obj)
71
	err := adapter.iter.Error
72
	if err == io.EOF {
73
		return nil
74
	}
75
	return adapter.iter.Error
76
}
77

78
// More is there more?
79
func (adapter *Decoder) More() bool {
80
	iter := adapter.iter
81
	if iter.Error != nil {
82
		return false
83
	}
84
	c := iter.nextToken()
85
	if c == 0 {
86
		return false
87
	}
88
	iter.unreadByte()
89
	return c != ']' && c != '}'
90
}
91

92
// Buffered remaining buffer
93
func (adapter *Decoder) Buffered() io.Reader {
94
	remaining := adapter.iter.buf[adapter.iter.head:adapter.iter.tail]
95
	return bytes.NewReader(remaining)
96
}
97

98
// UseNumber causes the Decoder to unmarshal a number into an interface{} as a
99
// Number instead of as a float64.
100
func (adapter *Decoder) UseNumber() {
101
	cfg := adapter.iter.cfg.configBeforeFrozen
102
	cfg.UseNumber = true
103
	adapter.iter.cfg = cfg.frozeWithCacheReuse(adapter.iter.cfg.extraExtensions)
104
}
105

106
// DisallowUnknownFields causes the Decoder to return an error when the destination
107
// is a struct and the input contains object keys which do not match any
108
// non-ignored, exported fields in the destination.
109
func (adapter *Decoder) DisallowUnknownFields() {
110
	cfg := adapter.iter.cfg.configBeforeFrozen
111
	cfg.DisallowUnknownFields = true
112
	adapter.iter.cfg = cfg.frozeWithCacheReuse(adapter.iter.cfg.extraExtensions)
113
}
114

115
// NewEncoder same as json.NewEncoder
116
func NewEncoder(writer io.Writer) *Encoder {
117
	return ConfigDefault.NewEncoder(writer)
118
}
119

120
// Encoder same as json.Encoder
121
type Encoder struct {
122
	stream *Stream
123
}
124

125
// Encode encode interface{} as JSON to io.Writer
126
func (adapter *Encoder) Encode(val interface{}) error {
127
	adapter.stream.WriteVal(val)
128
	adapter.stream.WriteRaw("\n")
129
	adapter.stream.Flush()
130
	return adapter.stream.Error
131
}
132

133
// SetIndent set the indention. Prefix is not supported
134
func (adapter *Encoder) SetIndent(prefix, indent string) {
135
	config := adapter.stream.cfg.configBeforeFrozen
136
	config.IndentionStep = len(indent)
137
	adapter.stream.cfg = config.frozeWithCacheReuse(adapter.stream.cfg.extraExtensions)
138
}
139

140
// SetEscapeHTML escape html by default, set to false to disable
141
func (adapter *Encoder) SetEscapeHTML(escapeHTML bool) {
142
	config := adapter.stream.cfg.configBeforeFrozen
143
	config.EscapeHTML = escapeHTML
144
	adapter.stream.cfg = config.frozeWithCacheReuse(adapter.stream.cfg.extraExtensions)
145
}
146

147
// Valid reports whether data is a valid JSON encoding.
148
func Valid(data []byte) bool {
149
	return ConfigDefault.Valid(data)
150
}
151

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.