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