Source file src/pkg/encoding/json/decode.go
1 // Copyright 2010 The Go Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
4
5 // Represents JSON data structure using native Go types: booleans, floats,
6 // strings, arrays, and maps.
7
8 package json
9
10 import (
11 "encoding/base64"
12 "errors"
13 "fmt"
14 "reflect"
15 "runtime"
16 "strconv"
17 "strings"
18 "unicode"
19 "unicode/utf16"
20 "unicode/utf8"
21 )
22
23 // Unmarshal parses the JSON-encoded data and stores the result
24 // in the value pointed to by v.
25 //
26 // Unmarshal uses the inverse of the encodings that
27 // Marshal uses, allocating maps, slices, and pointers as necessary,
28 // with the following additional rules:
29 //
30 // To unmarshal JSON into a pointer, Unmarshal first handles the case of
31 // the JSON being the JSON literal null. In that case, Unmarshal sets
32 // the pointer to nil. Otherwise, Unmarshal unmarshals the JSON into
33 // the value pointed at by the pointer. If the pointer is nil, Unmarshal
34 // allocates a new value for it to point to.
35 //
36 // To unmarshal JSON into an interface value, Unmarshal unmarshals
37 // the JSON into the concrete value contained in the interface value.
38 // If the interface value is nil, that is, has no concrete value stored in it,
39 // Unmarshal stores one of these in the interface value:
40 //
41 // bool, for JSON booleans
42 // float64, for JSON numbers
43 // string, for JSON strings
44 // []interface{}, for JSON arrays
45 // map[string]interface{}, for JSON objects
46 // nil for JSON null
47 //
48 // If a JSON value is not appropriate for a given target type,
49 // or if a JSON number overflows the target type, Unmarshal
50 // skips that field and completes the unmarshalling as best it can.
51 // If no more serious errors are encountered, Unmarshal returns
52 // an UnmarshalTypeError describing the earliest such error.
53 //
54 func Unmarshal(data []byte, v interface{}) error {
55 d := new(decodeState).init(data)
56
57 // Quick check for well-formedness.
58 // Avoids filling out half a data structure
59 // before discovering a JSON syntax error.
60 err := checkValid(data, &d.scan)
61 if err != nil {
62 return err
63 }
64
65 return d.unmarshal(v)
66 }
67
68 // Unmarshaler is the interface implemented by objects
69 // that can unmarshal a JSON description of themselves.
70 // The input can be assumed to be a valid JSON object
71 // encoding. UnmarshalJSON must copy the JSON data
72 // if it wishes to retain the data after returning.
73 type Unmarshaler interface {
74 UnmarshalJSON([]byte) error
75 }
76
77 // An UnmarshalTypeError describes a JSON value that was
78 // not appropriate for a value of a specific Go type.
79 type UnmarshalTypeError struct {
80 Value string // description of JSON value - "bool", "array", "number -5"
81 Type reflect.Type // type of Go value it could not be assigned to
82 }
83
84 func (e *UnmarshalTypeError) Error() string {
85 return "json: cannot unmarshal " + e.Value + " into Go value of type " + e.Type.String()
86 }
87
88 // An UnmarshalFieldError describes a JSON object key that
89 // led to an unexported (and therefore unwritable) struct field.
90 type UnmarshalFieldError struct {
91 Key string
92 Type reflect.Type
93 Field reflect.StructField
94 }
95
96 func (e *UnmarshalFieldError) Error() string {
97 return "json: cannot unmarshal object key " + strconv.Quote(e.Key) + " into unexported field " + e.Field.Name + " of type " + e.Type.String()
98 }
99
100 // An InvalidUnmarshalError describes an invalid argument passed to Unmarshal.
101 // (The argument to Unmarshal must be a non-nil pointer.)
102 type InvalidUnmarshalError struct {
103 Type reflect.Type
104 }
105
106 func (e *InvalidUnmarshalError) Error() string {
107 if e.Type == nil {
108 return "json: Unmarshal(nil)"
109 }
110
111 if e.Type.Kind() != reflect.Ptr {
112 return "json: Unmarshal(non-pointer " + e.Type.String() + ")"
113 }
114 return "json: Unmarshal(nil " + e.Type.String() + ")"
115 }
116
117 func (d *decodeState) unmarshal(v interface{}) (err error) {
118 defer func() {
119 if r := recover(); r != nil {
120 if _, ok := r.(runtime.Error); ok {
121 panic(r)
122 }
123 err = r.(error)
124 }
125 }()
126
127 rv := reflect.ValueOf(v)
128 pv := rv
129 if pv.Kind() != reflect.Ptr || pv.IsNil() {
130 return &InvalidUnmarshalError{reflect.TypeOf(v)}
131 }
132
133 d.scan.reset()
134 // We decode rv not pv.Elem because the Unmarshaler interface
135 // test must be applied at the top level of the value.
136 d.value(rv)
137 return d.savedError
138 }
139
140 // decodeState represents the state while decoding a JSON value.
141 type decodeState struct {
142 data []byte
143 off int // read offset in data
144 scan scanner
145 nextscan scanner // for calls to nextValue
146 savedError error
147 tempstr string // scratch space to avoid some allocations
148 }
149
150 // errPhase is used for errors that should not happen unless
151 // there is a bug in the JSON decoder or something is editing
152 // the data slice while the decoder executes.
153 var errPhase = errors.New("JSON decoder out of sync - data changing underfoot?")
154
155 func (d *decodeState) init(data []byte) *decodeState {
156 d.data = data
157 d.off = 0
158 d.savedError = nil
159 return d
160 }
161
162 // error aborts the decoding by panicking with err.
163 func (d *decodeState) error(err error) {
164 panic(err)
165 }
166
167 // saveError saves the first err it is called with,
168 // for reporting at the end of the unmarshal.
169 func (d *decodeState) saveError(err error) {
170 if d.savedError == nil {
171 d.savedError = err
172 }
173 }
174
175 // next cuts off and returns the next full JSON value in d.data[d.off:].
176 // The next value is known to be an object or array, not a literal.
177 func (d *decodeState) next() []byte {
178 c := d.data[d.off]
179 item, rest, err := nextValue(d.data[d.off:], &d.nextscan)
180 if err != nil {
181 d.error(err)
182 }
183 d.off = len(d.data) - len(rest)
184
185 // Our scanner has seen the opening brace/bracket
186 // and thinks we're still in the middle of the object.
187 // invent a closing brace/bracket to get it out.
188 if c == '{' {
189 d.scan.step(&d.scan, '}')
190 } else {
191 d.scan.step(&d.scan, ']')
192 }
193
194 return item
195 }
196
197 // scanWhile processes bytes in d.data[d.off:] until it
198 // receives a scan code not equal to op.
199 // It updates d.off and returns the new scan code.
200 func (d *decodeState) scanWhile(op int) int {
201 var newOp int
202 for {
203 if d.off >= len(d.data) {
204 newOp = d.scan.eof()
205 d.off = len(d.data) + 1 // mark processed EOF with len+1
206 } else {
207 c := int(d.data[d.off])
208 d.off++
209 newOp = d.scan.step(&d.scan, c)
210 }
211 if newOp != op {
212 break
213 }
214 }
215 return newOp
216 }
217
218 // value decodes a JSON value from d.data[d.off:] into the value.
219 // it updates d.off to point past the decoded value.
220 func (d *decodeState) value(v reflect.Value) {
221 if !v.IsValid() {
222 _, rest, err := nextValue(d.data[d.off:], &d.nextscan)
223 if err != nil {
224 d.error(err)
225 }
226 d.off = len(d.data) - len(rest)
227
228 // d.scan thinks we're still at the beginning of the item.
229 // Feed in an empty string - the shortest, simplest value -
230 // so that it knows we got to the end of the value.
231 if d.scan.redo {
232 // rewind.
233 d.scan.redo = false
234 d.scan.step = stateBeginValue
235 }
236 d.scan.step(&d.scan, '"')
237 d.scan.step(&d.scan, '"')
238 return
239 }
240
241 switch op := d.scanWhile(scanSkipSpace); op {
242 default:
243 d.error(errPhase)
244
245 case scanBeginArray:
246 d.array(v)
247
248 case scanBeginObject:
249 d.object(v)
250
251 case scanBeginLiteral:
252 d.literal(v)
253 }
254 }
255
256 // indirect walks down v allocating pointers as needed,
257 // until it gets to a non-pointer.
258 // if it encounters an Unmarshaler, indirect stops and returns that.
259 // if decodingNull is true, indirect stops at the last pointer so it can be set to nil.
260 func (d *decodeState) indirect(v reflect.Value, decodingNull bool) (Unmarshaler, reflect.Value) {
261 // If v is a named type and is addressable,
262 // start with its address, so that if the type has pointer methods,
263 // we find them.
264 if v.Kind() != reflect.Ptr && v.Type().Name() != "" && v.CanAddr() {
265 v = v.Addr()
266 }
267 for {
268 var isUnmarshaler bool
269 if v.Type().NumMethod() > 0 {
270 // Remember that this is an unmarshaler,
271 // but wait to return it until after allocating
272 // the pointer (if necessary).
273 _, isUnmarshaler = v.Interface().(Unmarshaler)
274 }
275
276 if iv := v; iv.Kind() == reflect.Interface && !iv.IsNil() {
277 v = iv.Elem()
278 continue
279 }
280
281 pv := v
282 if pv.Kind() != reflect.Ptr {
283 break
284 }
285
286 if pv.Elem().Kind() != reflect.Ptr && decodingNull && pv.CanSet() {
287 return nil, pv
288 }
289 if pv.IsNil() {
290 pv.Set(reflect.New(pv.Type().Elem()))
291 }
292 if isUnmarshaler {
293 // Using v.Interface().(Unmarshaler)
294 // here means that we have to use a pointer
295 // as the struct field. We cannot use a value inside
296 // a pointer to a struct, because in that case
297 // v.Interface() is the value (x.f) not the pointer (&x.f).
298 // This is an unfortunate consequence of reflect.
299 // An alternative would be to look up the
300 // UnmarshalJSON method and return a FuncValue.
301 return v.Interface().(Unmarshaler), reflect.Value{}
302 }
303 v = pv.Elem()
304 }
305 return nil, v
306 }
307
308 // array consumes an array from d.data[d.off-1:], decoding into the value v.
309 // the first byte of the array ('[') has been read already.
310 func (d *decodeState) array(v reflect.Value) {
311 // Check for unmarshaler.
312 unmarshaler, pv := d.indirect(v, false)
313 if unmarshaler != nil {
314 d.off--
315 err := unmarshaler.UnmarshalJSON(d.next())
316 if err != nil {
317 d.error(err)
318 }
319 return
320 }
321 v = pv
322
323 // Check type of target.
324 switch v.Kind() {
325 default:
326 d.saveError(&UnmarshalTypeError{"array", v.Type()})
327 d.off--
328 d.next()
329 return
330 case reflect.Interface:
331 // Decoding into nil interface? Switch to non-reflect code.
332 v.Set(reflect.ValueOf(d.arrayInterface()))
333 return
334 case reflect.Array:
335 case reflect.Slice:
336 break
337 }
338
339 i := 0
340 for {
341 // Look ahead for ] - can only happen on first iteration.
342 op := d.scanWhile(scanSkipSpace)
343 if op == scanEndArray {
344 break
345 }
346
347 // Back up so d.value can have the byte we just read.
348 d.off--
349 d.scan.undo(op)
350
351 // Get element of array, growing if necessary.
352 if v.Kind() == reflect.Slice {
353 // Grow slice if necessary
354 if i >= v.Cap() {
355 newcap := v.Cap() + v.Cap()/2
356 if newcap < 4 {
357 newcap = 4
358 }
359 newv := reflect.MakeSlice(v.Type(), v.Len(), newcap)
360 reflect.Copy(newv, v)
361 v.Set(newv)
362 }
363 if i >= v.Len() {
364 v.SetLen(i + 1)
365 }
366 }
367
368 if i < v.Len() {
369 // Decode into element.
370 d.value(v.Index(i))
371 } else {
372 // Ran out of fixed array: skip.
373 d.value(reflect.Value{})
374 }
375 i++
376
377 // Next token must be , or ].
378 op = d.scanWhile(scanSkipSpace)
379 if op == scanEndArray {
380 break
381 }
382 if op != scanArrayValue {
383 d.error(errPhase)
384 }
385 }
386
387 if i < v.Len() {
388 if v.Kind() == reflect.Array {
389 // Array. Zero the rest.
390 z := reflect.Zero(v.Type().Elem())
391 for ; i < v.Len(); i++ {
392 v.Index(i).Set(z)
393 }
394 } else {
395 v.SetLen(i)
396 }
397 }
398 if i == 0 && v.Kind() == reflect.Slice {
399 v.Set(reflect.MakeSlice(v.Type(), 0, 0))
400 }
401 }
402
403 // object consumes an object from d.data[d.off-1:], decoding into the value v.
404 // the first byte of the object ('{') has been read already.
405 func (d *decodeState) object(v reflect.Value) {
406 // Check for unmarshaler.
407 unmarshaler, pv := d.indirect(v, false)
408 if unmarshaler != nil {
409 d.off--
410 err := unmarshaler.UnmarshalJSON(d.next())
411 if err != nil {
412 d.error(err)
413 }
414 return
415 }
416 v = pv
417
418 // Decoding into nil interface? Switch to non-reflect code.
419 iv := v
420 if iv.Kind() == reflect.Interface {
421 iv.Set(reflect.ValueOf(d.objectInterface()))
422 return
423 }
424
425 // Check type of target: struct or map[string]T
426 var (
427 mv reflect.Value
428 sv reflect.Value
429 )
430 switch v.Kind() {
431 case reflect.Map:
432 // map must have string type
433 t := v.Type()
434 if t.Key() != reflect.TypeOf("") {
435 d.saveError(&UnmarshalTypeError{"object", v.Type()})
436 break
437 }
438 mv = v
439 if mv.IsNil() {
440 mv.Set(reflect.MakeMap(t))
441 }
442 case reflect.Struct:
443 sv = v
444 default:
445 d.saveError(&UnmarshalTypeError{"object", v.Type()})
446 }
447
448 if !mv.IsValid() && !sv.IsValid() {
449 d.off--
450 d.next() // skip over { } in input
451 return
452 }
453
454 var mapElem reflect.Value
455
456 for {
457 // Read opening " of string key or closing }.
458 op := d.scanWhile(scanSkipSpace)
459 if op == scanEndObject {
460 // closing } - can only happen on first iteration.
461 break
462 }
463 if op != scanBeginLiteral {
464 d.error(errPhase)
465 }
466
467 // Read string key.
468 start := d.off - 1
469 op = d.scanWhile(scanContinue)
470 item := d.data[start : d.off-1]
471 key, ok := unquote(item)
472 if !ok {
473 d.error(errPhase)
474 }
475
476 // Figure out field corresponding to key.
477 var subv reflect.Value
478 destring := false // whether the value is wrapped in a string to be decoded first
479
480 if mv.IsValid() {
481 elemType := mv.Type().Elem()
482 if !mapElem.IsValid() {
483 mapElem = reflect.New(elemType).Elem()
484 } else {
485 mapElem.Set(reflect.Zero(elemType))
486 }
487 subv = mapElem
488 } else {
489 var f reflect.StructField
490 var ok bool
491 st := sv.Type()
492 for i := 0; i < sv.NumField(); i++ {
493 sf := st.Field(i)
494 tag := sf.Tag.Get("json")
495 if tag == "-" {
496 // Pretend this field doesn't exist.
497 continue
498 }
499 if sf.Anonymous {
500 // Pretend this field doesn't exist,
501 // so that we can do a good job with
502 // these in a later version.
503 continue
504 }
505 // First, tag match
506 tagName, _ := parseTag(tag)
507 if tagName == key {
508 f = sf
509 ok = true
510 break // no better match possible
511 }
512 // Second, exact field name match
513 if sf.Name == key {
514 f = sf
515 ok = true
516 }
517 // Third, case-insensitive field name match,
518 // but only if a better match hasn't already been seen
519 if !ok && strings.EqualFold(sf.Name, key) {
520 f = sf
521 ok = true
522 }
523 }
524
525 // Extract value; name must be exported.
526 if ok {
527 if f.PkgPath != "" {
528 d.saveError(&UnmarshalFieldError{key, st, f})
529 } else {
530 subv = sv.FieldByIndex(f.Index)
531 }
532 _, opts := parseTag(f.Tag.Get("json"))
533 destring = opts.Contains("string")
534 }
535 }
536
537 // Read : before value.
538 if op == scanSkipSpace {
539 op = d.scanWhile(scanSkipSpace)
540 }
541 if op != scanObjectKey {
542 d.error(errPhase)
543 }
544
545 // Read value.
546 if destring {
547 d.value(reflect.ValueOf(&d.tempstr))
548 d.literalStore([]byte(d.tempstr), subv, true)
549 } else {
550 d.value(subv)
551 }
552 // Write value back to map;
553 // if using struct, subv points into struct already.
554 if mv.IsValid() {
555 mv.SetMapIndex(reflect.ValueOf(key), subv)
556 }
557
558 // Next token must be , or }.
559 op = d.scanWhile(scanSkipSpace)
560 if op == scanEndObject {
561 break
562 }
563 if op != scanObjectValue {
564 d.error(errPhase)
565 }
566 }
567 }
568
569 // literal consumes a literal from d.data[d.off-1:], decoding into the value v.
570 // The first byte of the literal has been read already
571 // (that's how the caller knows it's a literal).
572 func (d *decodeState) literal(v reflect.Value) {
573 // All bytes inside literal return scanContinue op code.
574 start := d.off - 1
575 op := d.scanWhile(scanContinue)
576
577 // Scan read one byte too far; back up.
578 d.off--
579 d.scan.undo(op)
580
581 d.literalStore(d.data[start:d.off], v, false)
582 }
583
584 // literalStore decodes a literal stored in item into v.
585 //
586 // fromQuoted indicates whether this literal came from unwrapping a
587 // string from the ",string" struct tag option. this is used only to
588 // produce more helpful error messages.
589 func (d *decodeState) literalStore(item []byte, v reflect.Value, fromQuoted bool) {
590 // Check for unmarshaler.
591 wantptr := item[0] == 'n' // null
592 unmarshaler, pv := d.indirect(v, wantptr)
593 if unmarshaler != nil {
594 err := unmarshaler.UnmarshalJSON(item)
595 if err != nil {
596 d.error(err)
597 }
598 return
599 }
600 v = pv
601
602 switch c := item[0]; c {
603 case 'n': // null
604 switch v.Kind() {
605 default:
606 d.saveError(&UnmarshalTypeError{"null", v.Type()})
607 case reflect.Interface, reflect.Ptr, reflect.Map, reflect.Slice:
608 v.Set(reflect.Zero(v.Type()))
609 }
610
611 case 't', 'f': // true, false
612 value := c == 't'
613 switch v.Kind() {
614 default:
615 if fromQuoted {
616 d.saveError(fmt.Errorf("json: invalid use of ,string struct tag, trying to unmarshal %q into %v", item, v.Type()))
617 } else {
618 d.saveError(&UnmarshalTypeError{"bool", v.Type()})
619 }
620 case reflect.Bool:
621 v.SetBool(value)
622 case reflect.Interface:
623 v.Set(reflect.ValueOf(value))
624 }
625
626 case '"': // string
627 s, ok := unquoteBytes(item)
628 if !ok {
629 if fromQuoted {
630 d.error(fmt.Errorf("json: invalid use of ,string struct tag, trying to unmarshal %q into %v", item, v.Type()))
631 } else {
632 d.error(errPhase)
633 }
634 }
635 switch v.Kind() {
636 default:
637 d.saveError(&UnmarshalTypeError{"string", v.Type()})
638 case reflect.Slice:
639 if v.Type() != byteSliceType {
640 d.saveError(&UnmarshalTypeError{"string", v.Type()})
641 break
642 }
643 b := make([]byte, base64.StdEncoding.DecodedLen(len(s)))
644 n, err := base64.StdEncoding.Decode(b, s)
645 if err != nil {
646 d.saveError(err)
647 break
648 }
649 v.Set(reflect.ValueOf(b[0:n]))
650 case reflect.String:
651 v.SetString(string(s))
652 case reflect.Interface:
653 v.Set(reflect.ValueOf(string(s)))
654 }
655
656 default: // number
657 if c != '-' && (c < '0' || c > '9') {
658 if fromQuoted {
659 d.error(fmt.Errorf("json: invalid use of ,string struct tag, trying to unmarshal %q into %v", item, v.Type()))
660 } else {
661 d.error(errPhase)
662 }
663 }
664 s := string(item)
665 switch v.Kind() {
666 default:
667 if fromQuoted {
668 d.error(fmt.Errorf("json: invalid use of ,string struct tag, trying to unmarshal %q into %v", item, v.Type()))
669 } else {
670 d.error(&UnmarshalTypeError{"number", v.Type()})
671 }
672 case reflect.Interface:
673 n, err := strconv.ParseFloat(s, 64)
674 if err != nil {
675 d.saveError(&UnmarshalTypeError{"number " + s, v.Type()})
676 break
677 }
678 v.Set(reflect.ValueOf(n))
679
680 case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
681 n, err := strconv.ParseInt(s, 10, 64)
682 if err != nil || v.OverflowInt(n) {
683 d.saveError(&UnmarshalTypeError{"number " + s, v.Type()})
684 break
685 }
686 v.SetInt(n)
687
688 case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
689 n, err := strconv.ParseUint(s, 10, 64)
690 if err != nil || v.OverflowUint(n) {
691 d.saveError(&UnmarshalTypeError{"number " + s, v.Type()})
692 break
693 }
694 v.SetUint(n)
695
696 case reflect.Float32, reflect.Float64:
697 n, err := strconv.ParseFloat(s, v.Type().Bits())
698 if err != nil || v.OverflowFloat(n) {
699 d.saveError(&UnmarshalTypeError{"number " + s, v.Type()})
700 break
701 }
702 v.SetFloat(n)
703 }
704 }
705 }
706
707 // The xxxInterface routines build up a value to be stored
708 // in an empty interface. They are not strictly necessary,
709 // but they avoid the weight of reflection in this common case.
710
711 // valueInterface is like value but returns interface{}
712 func (d *decodeState) valueInterface() interface{} {
713 switch d.scanWhile(scanSkipSpace) {
714 default:
715 d.error(errPhase)
716 case scanBeginArray:
717 return d.arrayInterface()
718 case scanBeginObject:
719 return d.objectInterface()
720 case scanBeginLiteral:
721 return d.literalInterface()
722 }
723 panic("unreachable")
724 }
725
726 // arrayInterface is like array but returns []interface{}.
727 func (d *decodeState) arrayInterface() []interface{} {
728 var v []interface{}
729 for {
730 // Look ahead for ] - can only happen on first iteration.
731 op := d.scanWhile(scanSkipSpace)
732 if op == scanEndArray {
733 break
734 }
735
736 // Back up so d.value can have the byte we just read.
737 d.off--
738 d.scan.undo(op)
739
740 v = append(v, d.valueInterface())
741
742 // Next token must be , or ].
743 op = d.scanWhile(scanSkipSpace)
744 if op == scanEndArray {
745 break
746 }
747 if op != scanArrayValue {
748 d.error(errPhase)
749 }
750 }
751 return v
752 }
753
754 // objectInterface is like object but returns map[string]interface{}.
755 func (d *decodeState) objectInterface() map[string]interface{} {
756 m := make(map[string]interface{})
757 for {
758 // Read opening " of string key or closing }.
759 op := d.scanWhile(scanSkipSpace)
760 if op == scanEndObject {
761 // closing } - can only happen on first iteration.
762 break
763 }
764 if op != scanBeginLiteral {
765 d.error(errPhase)
766 }
767
768 // Read string key.
769 start := d.off - 1
770 op = d.scanWhile(scanContinue)
771 item := d.data[start : d.off-1]
772 key, ok := unquote(item)
773 if !ok {
774 d.error(errPhase)
775 }
776
777 // Read : before value.
778 if op == scanSkipSpace {
779 op = d.scanWhile(scanSkipSpace)
780 }
781 if op != scanObjectKey {
782 d.error(errPhase)
783 }
784
785 // Read value.
786 m[key] = d.valueInterface()
787
788 // Next token must be , or }.
789 op = d.scanWhile(scanSkipSpace)
790 if op == scanEndObject {
791 break
792 }
793 if op != scanObjectValue {
794 d.error(errPhase)
795 }
796 }
797 return m
798 }
799
800 // literalInterface is like literal but returns an interface value.
801 func (d *decodeState) literalInterface() interface{} {
802 // All bytes inside literal return scanContinue op code.
803 start := d.off - 1
804 op := d.scanWhile(scanContinue)
805
806 // Scan read one byte too far; back up.
807 d.off--
808 d.scan.undo(op)
809 item := d.data[start:d.off]
810
811 switch c := item[0]; c {
812 case 'n': // null
813 return nil
814
815 case 't', 'f': // true, false
816 return c == 't'
817
818 case '"': // string
819 s, ok := unquote(item)
820 if !ok {
821 d.error(errPhase)
822 }
823 return s
824
825 default: // number
826 if c != '-' && (c < '0' || c > '9') {
827 d.error(errPhase)
828 }
829 n, err := strconv.ParseFloat(string(item), 64)
830 if err != nil {
831 d.saveError(&UnmarshalTypeError{"number " + string(item), reflect.TypeOf(0.0)})
832 }
833 return n
834 }
835 panic("unreachable")
836 }
837
838 // getu4 decodes \uXXXX from the beginning of s, returning the hex value,
839 // or it returns -1.
840 func getu4(s []byte) rune {
841 if len(s) < 6 || s[0] != '\\' || s[1] != 'u' {
842 return -1
843 }
844 r, err := strconv.ParseUint(string(s[2:6]), 16, 64)
845 if err != nil {
846 return -1
847 }
848 return rune(r)
849 }
850
851 // unquote converts a quoted JSON string literal s into an actual string t.
852 // The rules are different than for Go, so cannot use strconv.Unquote.
853 func unquote(s []byte) (t string, ok bool) {
854 s, ok = unquoteBytes(s)
855 t = string(s)
856 return
857 }
858
859 func unquoteBytes(s []byte) (t []byte, ok bool) {
860 if len(s) < 2 || s[0] != '"' || s[len(s)-1] != '"' {
861 return
862 }
863 s = s[1 : len(s)-1]
864
865 // Check for unusual characters. If there are none,
866 // then no unquoting is needed, so return a slice of the
867 // original bytes.
868 r := 0
869 for r < len(s) {
870 c := s[r]
871 if c == '\\' || c == '"' || c < ' ' {
872 break
873 }
874 if c < utf8.RuneSelf {
875 r++
876 continue
877 }
878 rr, size := utf8.DecodeRune(s[r:])
879 if rr == utf8.RuneError && size == 1 {
880 break
881 }
882 r += size
883 }
884 if r == len(s) {
885 return s, true
886 }
887
888 b := make([]byte, len(s)+2*utf8.UTFMax)
889 w := copy(b, s[0:r])
890 for r < len(s) {
891 // Out of room? Can only happen if s is full of
892 // malformed UTF-8 and we're replacing each
893 // byte with RuneError.
894 if w >= len(b)-2*utf8.UTFMax {
895 nb := make([]byte, (len(b)+utf8.UTFMax)*2)
896 copy(nb, b[0:w])
897 b = nb
898 }
899 switch c := s[r]; {
900 case c == '\\':
901 r++
902 if r >= len(s) {
903 return
904 }
905 switch s[r] {
906 default:
907 return
908 case '"', '\\', '/', '\'':
909 b[w] = s[r]
910 r++
911 w++
912 case 'b':
913 b[w] = '\b'
914 r++
915 w++
916 case 'f':
917 b[w] = '\f'
918 r++
919 w++
920 case 'n':
921 b[w] = '\n'
922 r++
923 w++
924 case 'r':
925 b[w] = '\r'
926 r++
927 w++
928 case 't':
929 b[w] = '\t'
930 r++
931 w++
932 case 'u':
933 r--
934 rr := getu4(s[r:])
935 if rr < 0 {
936 return
937 }
938 r += 6
939 if utf16.IsSurrogate(rr) {
940 rr1 := getu4(s[r:])
941 if dec := utf16.DecodeRune(rr, rr1); dec != unicode.ReplacementChar {
942 // A valid pair; consume.
943 r += 6
944 w += utf8.EncodeRune(b[w:], dec)
945 break
946 }
947 // Invalid surrogate; fall back to replacement rune.
948 rr = unicode.ReplacementChar
949 }
950 w += utf8.EncodeRune(b[w:], rr)
951 }
952
953 // Quote, control characters are invalid.
954 case c == '"', c < ' ':
955 return
956
957 // ASCII
958 case c < utf8.RuneSelf:
959 b[w] = c
960 r++
961 w++
962
963 // Coerce to well-formed UTF-8.
964 default:
965 rr, size := utf8.DecodeRune(s[r:])
966 r += size
967 w += utf8.EncodeRune(b[w:], rr)
968 }
969 }
970 return b[0:w], true
971 }
972
973 // The following is issue 3069.
974
975 // BUG(rsc): This package ignores anonymous (embedded) struct fields
976 // during encoding and decoding. A future version may assign meaning
977 // to them. To force an anonymous field to be ignored in all future
978 // versions of this package, use an explicit `json:"-"` tag in the struct
979 // definition.