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