1
2
3
4
5 package json
6
7 import (
8 "bytes"
9 "errors"
10 "io"
11 )
12
13
14 type Decoder struct {
15 r io.Reader
16 buf []byte
17 d decodeState
18 scanp int
19 scan scanner
20 err error
21
22 tokenState int
23 tokenStack []int
24 }
25
26
27
28
29
30 func NewDecoder(r io.Reader) *Decoder {
31 return &Decoder{r: r}
32 }
33
34
35
36
37 func (dec *Decoder) UseNumber() { dec.d.numberType = UnmarshalJSONNumber }
38
39
40
41 func (dec *Decoder) SetNumberType(t NumberUnmarshalType) { dec.d.numberType = t }
42
43
44
45
46
47
48 func (dec *Decoder) Decode(v interface{}) error {
49 if dec.err != nil {
50 return dec.err
51 }
52
53 if err := dec.tokenPrepareForDecode(); err != nil {
54 return err
55 }
56
57 if !dec.tokenValueAllowed() {
58 return &SyntaxError{msg: "not at beginning of value"}
59 }
60
61
62 n, err := dec.readValue()
63 if err != nil {
64 return err
65 }
66 dec.d.init(dec.buf[dec.scanp : dec.scanp+n])
67 dec.scanp += n
68
69
70
71
72 err = dec.d.unmarshal(v)
73
74
75 dec.tokenValueEnd()
76
77 return err
78 }
79
80
81
82 func (dec *Decoder) Buffered() io.Reader {
83 return bytes.NewReader(dec.buf[dec.scanp:])
84 }
85
86
87
88 func (dec *Decoder) readValue() (int, error) {
89 dec.scan.reset()
90
91 scanp := dec.scanp
92 var err error
93 Input:
94 for {
95
96 for i, c := range dec.buf[scanp:] {
97 dec.scan.bytes++
98 v := dec.scan.step(&dec.scan, c)
99 if v == scanEnd {
100 scanp += i
101 break Input
102 }
103
104
105
106 if (v == scanEndObject || v == scanEndArray) && dec.scan.step(&dec.scan, ' ') == scanEnd {
107 scanp += i + 1
108 break Input
109 }
110 if v == scanError {
111 dec.err = dec.scan.err
112 return 0, dec.scan.err
113 }
114 }
115 scanp = len(dec.buf)
116
117
118
119 if err != nil {
120 if err == io.EOF {
121 if dec.scan.step(&dec.scan, ' ') == scanEnd {
122 break Input
123 }
124 if nonSpace(dec.buf) {
125 err = io.ErrUnexpectedEOF
126 }
127 }
128 dec.err = err
129 return 0, err
130 }
131
132 n := scanp - dec.scanp
133 err = dec.refill()
134 scanp = dec.scanp + n
135 }
136 return scanp - dec.scanp, nil
137 }
138
139 func (dec *Decoder) refill() error {
140
141
142 if dec.scanp > 0 {
143 n := copy(dec.buf, dec.buf[dec.scanp:])
144 dec.buf = dec.buf[:n]
145 dec.scanp = 0
146 }
147
148
149 const minRead = 512
150 if cap(dec.buf)-len(dec.buf) < minRead {
151 newBuf := make([]byte, len(dec.buf), 2*cap(dec.buf)+minRead)
152 copy(newBuf, dec.buf)
153 dec.buf = newBuf
154 }
155
156
157 n, err := dec.r.Read(dec.buf[len(dec.buf):cap(dec.buf)])
158 dec.buf = dec.buf[0 : len(dec.buf)+n]
159
160 return err
161 }
162
163 func nonSpace(b []byte) bool {
164 for _, c := range b {
165 if !isSpace(c) {
166 return true
167 }
168 }
169 return false
170 }
171
172
173 type Encoder struct {
174 w io.Writer
175 err error
176 }
177
178
179 func NewEncoder(w io.Writer) *Encoder {
180 return &Encoder{w: w}
181 }
182
183
184
185
186
187
188 func (enc *Encoder) Encode(v interface{}) error {
189 if enc.err != nil {
190 return enc.err
191 }
192 e := newEncodeState()
193 err := e.marshal(v)
194 if err != nil {
195 return err
196 }
197
198
199
200
201
202
203
204 e.WriteByte('\n')
205
206 if _, err = enc.w.Write(e.Bytes()); err != nil {
207 enc.err = err
208 }
209 encodeStatePool.Put(e)
210 return err
211 }
212
213
214
215
216 type RawMessage []byte
217
218
219 func (m *RawMessage) MarshalJSON() ([]byte, error) {
220 return *m, nil
221 }
222
223
224 func (m *RawMessage) UnmarshalJSON(data []byte) error {
225 if m == nil {
226 return errors.New("json.RawMessage: UnmarshalJSON on nil pointer")
227 }
228 *m = append((*m)[0:0], data...)
229 return nil
230 }
231
232 var _ Marshaler = (*RawMessage)(nil)
233 var _ Unmarshaler = (*RawMessage)(nil)
234
235
236
237
238
239
240
241
242
243
244 type Token interface{}
245
246 const (
247 tokenTopValue = iota
248 tokenArrayStart
249 tokenArrayValue
250 tokenArrayComma
251 tokenObjectStart
252 tokenObjectKey
253 tokenObjectColon
254 tokenObjectValue
255 tokenObjectComma
256 )
257
258
259 func (dec *Decoder) tokenPrepareForDecode() error {
260
261
262
263 switch dec.tokenState {
264 case tokenArrayComma:
265 c, err := dec.peek()
266 if err != nil {
267 return err
268 }
269 if c != ',' {
270 return &SyntaxError{"expected comma after array element", 0}
271 }
272 dec.scanp++
273 dec.tokenState = tokenArrayValue
274 case tokenObjectColon:
275 c, err := dec.peek()
276 if err != nil {
277 return err
278 }
279 if c != ':' {
280 return &SyntaxError{"expected colon after object key", 0}
281 }
282 dec.scanp++
283 dec.tokenState = tokenObjectValue
284 }
285 return nil
286 }
287
288 func (dec *Decoder) tokenValueAllowed() bool {
289 switch dec.tokenState {
290 case tokenTopValue, tokenArrayStart, tokenArrayValue, tokenObjectValue:
291 return true
292 }
293 return false
294 }
295
296 func (dec *Decoder) tokenValueEnd() {
297 switch dec.tokenState {
298 case tokenArrayStart, tokenArrayValue:
299 dec.tokenState = tokenArrayComma
300 case tokenObjectValue:
301 dec.tokenState = tokenObjectComma
302 }
303 }
304
305
306 type Delim rune
307
308 func (d Delim) String() string {
309 return string(d)
310 }
311
312
313
314
315
316
317
318
319
320
321
322
323 func (dec *Decoder) Token() (Token, error) {
324 for {
325 c, err := dec.peek()
326 if err != nil {
327 return nil, err
328 }
329 switch c {
330 case '[':
331 if !dec.tokenValueAllowed() {
332 return dec.tokenError(c)
333 }
334 dec.scanp++
335 dec.tokenStack = append(dec.tokenStack, dec.tokenState)
336 dec.tokenState = tokenArrayStart
337 return Delim('['), nil
338
339 case ']':
340 if dec.tokenState != tokenArrayStart && dec.tokenState != tokenArrayComma {
341 return dec.tokenError(c)
342 }
343 dec.scanp++
344 dec.tokenState = dec.tokenStack[len(dec.tokenStack)-1]
345 dec.tokenStack = dec.tokenStack[:len(dec.tokenStack)-1]
346 dec.tokenValueEnd()
347 return Delim(']'), nil
348
349 case '{':
350 if !dec.tokenValueAllowed() {
351 return dec.tokenError(c)
352 }
353 dec.scanp++
354 dec.tokenStack = append(dec.tokenStack, dec.tokenState)
355 dec.tokenState = tokenObjectStart
356 return Delim('{'), nil
357
358 case '}':
359 if dec.tokenState != tokenObjectStart && dec.tokenState != tokenObjectComma {
360 return dec.tokenError(c)
361 }
362 dec.scanp++
363 dec.tokenState = dec.tokenStack[len(dec.tokenStack)-1]
364 dec.tokenStack = dec.tokenStack[:len(dec.tokenStack)-1]
365 dec.tokenValueEnd()
366 return Delim('}'), nil
367
368 case ':':
369 if dec.tokenState != tokenObjectColon {
370 return dec.tokenError(c)
371 }
372 dec.scanp++
373 dec.tokenState = tokenObjectValue
374 continue
375
376 case ',':
377 if dec.tokenState == tokenArrayComma {
378 dec.scanp++
379 dec.tokenState = tokenArrayValue
380 continue
381 }
382 if dec.tokenState == tokenObjectComma {
383 dec.scanp++
384 dec.tokenState = tokenObjectKey
385 continue
386 }
387 return dec.tokenError(c)
388
389 case '"':
390 if dec.tokenState == tokenObjectStart || dec.tokenState == tokenObjectKey {
391 var x string
392 old := dec.tokenState
393 dec.tokenState = tokenTopValue
394 err := dec.Decode(&x)
395 dec.tokenState = old
396 if err != nil {
397 clearOffset(err)
398 return nil, err
399 }
400 dec.tokenState = tokenObjectColon
401 return x, nil
402 }
403 fallthrough
404
405 default:
406 if !dec.tokenValueAllowed() {
407 return dec.tokenError(c)
408 }
409 var x interface{}
410 if err := dec.Decode(&x); err != nil {
411 clearOffset(err)
412 return nil, err
413 }
414 return x, nil
415 }
416 }
417 }
418
419 func clearOffset(err error) {
420 if s, ok := err.(*SyntaxError); ok {
421 s.Offset = 0
422 }
423 }
424
425 func (dec *Decoder) tokenError(c byte) (Token, error) {
426 var context string
427 switch dec.tokenState {
428 case tokenTopValue:
429 context = " looking for beginning of value"
430 case tokenArrayStart, tokenArrayValue, tokenObjectValue:
431 context = " looking for beginning of value"
432 case tokenArrayComma:
433 context = " after array element"
434 case tokenObjectKey:
435 context = " looking for beginning of object key string"
436 case tokenObjectColon:
437 context = " after object key"
438 case tokenObjectComma:
439 context = " after object key:value pair"
440 }
441 return nil, &SyntaxError{"invalid character " + quoteChar(c) + " " + context, 0}
442 }
443
444
445
446 func (dec *Decoder) More() bool {
447 c, err := dec.peek()
448 return err == nil && c != ']' && c != '}'
449 }
450
451 func (dec *Decoder) peek() (byte, error) {
452 var err error
453 for {
454 for i := dec.scanp; i < len(dec.buf); i++ {
455 c := dec.buf[i]
456 if isSpace(c) {
457 continue
458 }
459 dec.scanp = i
460 return c, nil
461 }
462
463 if err != nil {
464 return 0, err
465 }
466 err = dec.refill()
467 }
468 }
469
470
486
View as plain text