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
27
28
29 func NewDecoder(r io.Reader) *Decoder {
30
31
32
33 if _, ok := r.(*bytes.Buffer); ok {
34 r = struct{ io.Reader }{r}
35 }
36
37 dec := new(Decoder)
38 dec.opts = DefaultOptionsV1()
39 dec.dec = jsontext.NewDecoder(r, dec.opts)
40 return dec
41 }
42
43
44
45 func (dec *Decoder) UseNumber() {
46 if useNumber, _ := jsonv2.GetOption(dec.opts, unmarshalAnyWithRawNumber); !useNumber {
47 dec.opts = jsonv2.JoinOptions(dec.opts, unmarshalAnyWithRawNumber(true))
48 }
49 }
50
51
52
53
54 func (dec *Decoder) DisallowUnknownFields() {
55 if reject, _ := jsonv2.GetOption(dec.opts, jsonv2.RejectUnknownMembers); !reject {
56 dec.opts = jsonv2.JoinOptions(dec.opts, jsonv2.RejectUnknownMembers(true))
57 }
58 }
59
60
61
62
63
64
65 func (dec *Decoder) Decode(v any) error {
66 if dec.err != nil {
67 return dec.err
68 }
69 b, err := dec.dec.ReadValue()
70 if err != nil {
71 dec.err = transformSyntacticError(err)
72 if dec.err.Error() == errUnexpectedEnd.Error() {
73
74
75 dec.err = io.ErrUnexpectedEOF
76 }
77 return dec.err
78 }
79 return jsonv2.Unmarshal(b, v, dec.opts)
80 }
81
82
83
84 func (dec *Decoder) Buffered() io.Reader {
85 return bytes.NewReader(dec.dec.UnreadBuffer())
86 }
87
88
89 type Encoder struct {
90 w io.Writer
91 opts jsonv2.Options
92 err error
93
94 buf bytes.Buffer
95 indentBuf bytes.Buffer
96
97 indentPrefix string
98 indentValue string
99 }
100
101
102 func NewEncoder(w io.Writer) *Encoder {
103 enc := new(Encoder)
104 enc.w = w
105 enc.opts = DefaultOptionsV1()
106 return enc
107 }
108
109
110
111
112
113
114 func (enc *Encoder) Encode(v any) error {
115 if enc.err != nil {
116 return enc.err
117 }
118
119 buf := &enc.buf
120 buf.Reset()
121 if err := jsonv2.MarshalWrite(buf, v, enc.opts); err != nil {
122 return err
123 }
124 if len(enc.indentPrefix)+len(enc.indentValue) > 0 {
125 enc.indentBuf.Reset()
126 if err := Indent(&enc.indentBuf, buf.Bytes(), enc.indentPrefix, enc.indentValue); err != nil {
127 return err
128 }
129 buf = &enc.indentBuf
130 }
131 buf.WriteByte('\n')
132
133 if _, err := enc.w.Write(buf.Bytes()); err != nil {
134 enc.err = err
135 return err
136 }
137 return nil
138 }
139
140
141
142
143 func (enc *Encoder) SetIndent(prefix, indent string) {
144 enc.indentPrefix = prefix
145 enc.indentValue = indent
146 }
147
148
149
150
151
152
153
154
155 func (enc *Encoder) SetEscapeHTML(on bool) {
156 if escape, _ := jsonv2.GetOption(enc.opts, jsontext.EscapeForHTML); escape != on {
157 enc.opts = jsonv2.JoinOptions(enc.opts, jsontext.EscapeForHTML(on))
158 }
159 }
160
161
162
163
164 type RawMessage = jsontext.Value
165
166
167
168
169
170
171
172
173
174 type Token any
175
176
177 type Delim rune
178
179 func (d Delim) String() string {
180 return string(d)
181 }
182
183
184
185
186
187
188
189
190
191
192
193
194 func (dec *Decoder) Token() (Token, error) {
195 tok, err := dec.dec.ReadToken()
196 if err != nil {
197
198
199
200
201 if errors.Is(err, io.ErrUnexpectedEOF) {
202 if len(bytes.Trim(dec.dec.UnreadBuffer(), " \r\n\t,:")) == 0 {
203 return nil, io.EOF
204 }
205 return nil, io.ErrUnexpectedEOF
206 }
207 return nil, transformSyntacticError(err)
208 }
209 switch k := tok.Kind(); k {
210 case 'n':
211 return nil, nil
212 case 'f':
213 return false, nil
214 case 't':
215 return true, nil
216 case '"':
217 return tok.String(), nil
218 case '0':
219 if useNumber, _ := jsonv2.GetOption(dec.opts, unmarshalAnyWithRawNumber); useNumber {
220 return Number(tok.String()), nil
221 }
222 return tok.Float(), nil
223 case '{', '}', '[', ']':
224 return Delim(k), nil
225 default:
226 panic("unreachable")
227 }
228 }
229
230
231
232 func (dec *Decoder) More() bool {
233 k := dec.dec.PeekKind()
234 return k > 0 && k != ']' && k != '}'
235 }
236
237
238
239
240 func (dec *Decoder) InputOffset() int64 {
241 return dec.dec.InputOffset()
242 }
243
View as plain text