1
2
3
4
5
6
7 package json
8
9 import (
10 "bytes"
11 "errors"
12 "io"
13
14 "encoding/json/jsontext"
15 jsonv2 "encoding/json/v2"
16 )
17
18
19 type Decoder struct {
20 dec *jsontext.Decoder
21 opts jsonv2.Options
22 err error
23
24
25
26 hadPeeked bool
27 }
28
29
30
31
32
33 func NewDecoder(r io.Reader) *Decoder {
34
35
36
37 if _, ok := r.(*bytes.Buffer); ok {
38 r = struct{ io.Reader }{r}
39 }
40
41 dec := new(Decoder)
42 dec.opts = DefaultOptionsV1()
43 dec.dec = jsontext.NewDecoder(r, dec.opts)
44 return dec
45 }
46
47
48
49 func (dec *Decoder) UseNumber() {
50 if useNumber, _ := jsonv2.GetOption(dec.opts, unmarshalAnyWithRawNumber); !useNumber {
51 dec.opts = jsonv2.JoinOptions(dec.opts, unmarshalAnyWithRawNumber(true))
52 }
53 }
54
55
56
57
58 func (dec *Decoder) DisallowUnknownFields() {
59 if reject, _ := jsonv2.GetOption(dec.opts, jsonv2.RejectUnknownMembers); !reject {
60 dec.opts = jsonv2.JoinOptions(dec.opts, jsonv2.RejectUnknownMembers(true))
61 }
62 }
63
64
65
66
67
68
69 func (dec *Decoder) Decode(v any) error {
70 if dec.err != nil {
71 return dec.err
72 }
73 b, err := dec.dec.ReadValue()
74 if err != nil {
75 dec.err = transformSyntacticError(err)
76 if dec.err.Error() == errUnexpectedEnd.Error() {
77
78
79 dec.err = io.ErrUnexpectedEOF
80 }
81 return dec.err
82 }
83 dec.hadPeeked = false
84 return jsonv2.Unmarshal(b, v, dec.opts)
85 }
86
87
88
89 func (dec *Decoder) Buffered() io.Reader {
90 return bytes.NewReader(dec.dec.UnreadBuffer())
91 }
92
93
94 type Encoder struct {
95 w io.Writer
96 opts jsonv2.Options
97 err error
98
99 indentBuf bytes.Buffer
100
101 indentPrefix string
102 indentValue string
103 }
104
105
106 func NewEncoder(w io.Writer) *Encoder {
107 enc := new(Encoder)
108 enc.w = w
109 enc.opts = DefaultOptionsV1()
110 return enc
111 }
112
113
114
115
116
117
118 func (enc *Encoder) Encode(v any) error {
119 if enc.err != nil {
120 return enc.err
121 }
122
123 e := export.GetBufferedEncoder(enc.opts)
124 defer export.PutBufferedEncoder(e)
125 if err := jsonv2.MarshalEncode(e, v); err != nil {
126 return err
127 }
128 b := export.Encoder(e).Buf
129 if len(enc.indentPrefix)+len(enc.indentValue) > 0 {
130 enc.indentBuf.Reset()
131 if err := Indent(&enc.indentBuf, b, enc.indentPrefix, enc.indentValue); err != nil {
132 return err
133 }
134 b = enc.indentBuf.Bytes()
135 }
136 b = append(b, '\n')
137
138 if _, err := enc.w.Write(b); err != nil {
139 enc.err = err
140 return err
141 }
142 return nil
143 }
144
145
146
147
148 func (enc *Encoder) SetIndent(prefix, indent string) {
149
150
151
152 enc.indentPrefix = prefix
153 enc.indentValue = indent
154 }
155
156
157
158
159
160
161
162
163 func (enc *Encoder) SetEscapeHTML(on bool) {
164 if escape, _ := jsonv2.GetOption(enc.opts, jsontext.EscapeForHTML); escape != on {
165 enc.opts = jsonv2.JoinOptions(enc.opts, jsontext.EscapeForHTML(on))
166 }
167 }
168
169
170
171
172 type RawMessage = jsontext.Value
173
174
175
176
177
178
179
180
181
182 type Token any
183
184
185 type Delim rune
186
187 func (d Delim) String() string {
188 return string(d)
189 }
190
191
192
193
194
195
196
197
198
199
200
201
202 func (dec *Decoder) Token() (Token, error) {
203 if dec.err != nil {
204 return nil, dec.err
205 }
206 tok, err := dec.dec.ReadToken()
207 if err != nil {
208
209
210
211
212 if errors.Is(err, io.ErrUnexpectedEOF) {
213 if len(bytes.Trim(dec.dec.UnreadBuffer(), " \r\n\t,:")) == 0 {
214 return nil, io.EOF
215 }
216 return nil, io.ErrUnexpectedEOF
217 }
218 return nil, transformSyntacticError(err)
219 }
220 dec.hadPeeked = false
221 switch k := tok.Kind(); k {
222 case 'n':
223 return nil, nil
224 case 'f':
225 return false, nil
226 case 't':
227 return true, nil
228 case '"':
229 return tok.String(), nil
230 case '0':
231 if useNumber, _ := jsonv2.GetOption(dec.opts, unmarshalAnyWithRawNumber); useNumber {
232 return Number(tok.String()), nil
233 }
234 return tok.Float(), nil
235 case '{', '}', '[', ']':
236 return Delim(k), nil
237 default:
238 panic("unreachable")
239 }
240 }
241
242
243
244 func (dec *Decoder) More() bool {
245 dec.hadPeeked = true
246 k := dec.dec.PeekKind()
247 if k == 0 {
248 if dec.err == nil {
249
250
251 _, err := dec.dec.ReadToken()
252 if err == nil {
253
254 err = errors.New("json: successful read after failed peek")
255 }
256 dec.err = transformSyntacticError(err)
257 }
258 return dec.err != io.EOF
259 }
260 return k != ']' && k != '}'
261 }
262
263
264
265
266 func (dec *Decoder) InputOffset() int64 {
267 offset := dec.dec.InputOffset()
268 if dec.hadPeeked {
269
270
271
272
273 unreadBuffer := dec.dec.UnreadBuffer()
274 trailingTokens := bytes.TrimLeft(unreadBuffer, " \n\r\t")
275 if len(trailingTokens) > 0 {
276 leadingWhitespace := len(unreadBuffer) - len(trailingTokens)
277 offset += int64(leadingWhitespace)
278 }
279 }
280 return offset
281 }
282
View as plain text