1
2
3
4
5
6
7
8
9
10 package json
11
12 import (
13 "encoding"
14 "encoding/base64"
15 "fmt"
16 "reflect"
17 "strconv"
18 "strings"
19 "unicode"
20 "unicode/utf16"
21 "unicode/utf8"
22 )
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108 func Unmarshal(data []byte, v any) error {
109
110
111
112 var d decodeState
113 err := checkValid(data, &d.scan)
114 if err != nil {
115 return err
116 }
117
118 d.init(data)
119 return d.unmarshal(v)
120 }
121
122
123
124
125
126
127 type Unmarshaler interface {
128 UnmarshalJSON([]byte) error
129 }
130
131
132
133 type UnmarshalTypeError struct {
134 Value string
135 Type reflect.Type
136 Offset int64
137 Struct string
138 Field string
139 }
140
141 func (e *UnmarshalTypeError) Error() string {
142 if e.Struct != "" || e.Field != "" {
143 return "json: cannot unmarshal " + e.Value + " into Go struct field " + e.Struct + "." + e.Field + " of type " + e.Type.String()
144 }
145 return "json: cannot unmarshal " + e.Value + " into Go value of type " + e.Type.String()
146 }
147
148
149
150
151
152 type UnmarshalFieldError struct {
153 Key string
154 Type reflect.Type
155 Field reflect.StructField
156 }
157
158 func (e *UnmarshalFieldError) Error() string {
159 return "json: cannot unmarshal object key " + strconv.Quote(e.Key) + " into unexported field " + e.Field.Name + " of type " + e.Type.String()
160 }
161
162
163
164 type InvalidUnmarshalError struct {
165 Type reflect.Type
166 }
167
168 func (e *InvalidUnmarshalError) Error() string {
169 if e.Type == nil {
170 return "json: Unmarshal(nil)"
171 }
172
173 if e.Type.Kind() != reflect.Pointer {
174 return "json: Unmarshal(non-pointer " + e.Type.String() + ")"
175 }
176 return "json: Unmarshal(nil " + e.Type.String() + ")"
177 }
178
179 func (d *decodeState) unmarshal(v any) error {
180 rv := reflect.ValueOf(v)
181 if rv.Kind() != reflect.Pointer || rv.IsNil() {
182 return &InvalidUnmarshalError{reflect.TypeOf(v)}
183 }
184
185 d.scan.reset()
186 d.scanWhile(scanSkipSpace)
187
188
189 err := d.value(rv)
190 if err != nil {
191 return d.addErrorContext(err)
192 }
193 return d.savedError
194 }
195
196
197
198 type Number string
199
200
201 func (n Number) String() string { return string(n) }
202
203
204 func (n Number) Float64() (float64, error) {
205 return strconv.ParseFloat(string(n), 64)
206 }
207
208
209 func (n Number) Int64() (int64, error) {
210 return strconv.ParseInt(string(n), 10, 64)
211 }
212
213
214 type errorContext struct {
215 Struct reflect.Type
216 FieldStack []string
217 }
218
219
220 type decodeState struct {
221 data []byte
222 off int
223 opcode int
224 scan scanner
225 errorContext *errorContext
226 savedError error
227 useNumber bool
228 disallowUnknownFields bool
229 }
230
231
232 func (d *decodeState) readIndex() int {
233 return d.off - 1
234 }
235
236
237
238
239 const phasePanicMsg = "JSON decoder out of sync - data changing underfoot?"
240
241 func (d *decodeState) init(data []byte) *decodeState {
242 d.data = data
243 d.off = 0
244 d.savedError = nil
245 if d.errorContext != nil {
246 d.errorContext.Struct = nil
247
248 d.errorContext.FieldStack = d.errorContext.FieldStack[:0]
249 }
250 return d
251 }
252
253
254
255 func (d *decodeState) saveError(err error) {
256 if d.savedError == nil {
257 d.savedError = d.addErrorContext(err)
258 }
259 }
260
261
262 func (d *decodeState) addErrorContext(err error) error {
263 if d.errorContext != nil && (d.errorContext.Struct != nil || len(d.errorContext.FieldStack) > 0) {
264 switch err := err.(type) {
265 case *UnmarshalTypeError:
266 err.Struct = d.errorContext.Struct.Name()
267 fieldStack := d.errorContext.FieldStack
268 if err.Field != "" {
269 fieldStack = append(fieldStack, err.Field)
270 }
271 err.Field = strings.Join(fieldStack, ".")
272 }
273 }
274 return err
275 }
276
277
278 func (d *decodeState) skip() {
279 s, data, i := &d.scan, d.data, d.off
280 depth := len(s.parseState)
281 for {
282 op := s.step(s, data[i])
283 i++
284 if len(s.parseState) < depth {
285 d.off = i
286 d.opcode = op
287 return
288 }
289 }
290 }
291
292
293 func (d *decodeState) scanNext() {
294 if d.off < len(d.data) {
295 d.opcode = d.scan.step(&d.scan, d.data[d.off])
296 d.off++
297 } else {
298 d.opcode = d.scan.eof()
299 d.off = len(d.data) + 1
300 }
301 }
302
303
304
305 func (d *decodeState) scanWhile(op int) {
306 s, data, i := &d.scan, d.data, d.off
307 for i < len(data) {
308 newOp := s.step(s, data[i])
309 i++
310 if newOp != op {
311 d.opcode = newOp
312 d.off = i
313 return
314 }
315 }
316
317 d.off = len(data) + 1
318 d.opcode = d.scan.eof()
319 }
320
321
322
323
324
325
326
327
328
329 func (d *decodeState) rescanLiteral() {
330 data, i := d.data, d.off
331 Switch:
332 switch data[i-1] {
333 case '"':
334 for ; i < len(data); i++ {
335 switch data[i] {
336 case '\\':
337 i++
338 case '"':
339 i++
340 break Switch
341 }
342 }
343 case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '-':
344 for ; i < len(data); i++ {
345 switch data[i] {
346 case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
347 '.', 'e', 'E', '+', '-':
348 default:
349 break Switch
350 }
351 }
352 case 't':
353 i += len("rue")
354 case 'f':
355 i += len("alse")
356 case 'n':
357 i += len("ull")
358 }
359 if i < len(data) {
360 d.opcode = stateEndValue(&d.scan, data[i])
361 } else {
362 d.opcode = scanEnd
363 }
364 d.off = i + 1
365 }
366
367
368
369
370 func (d *decodeState) value(v reflect.Value) error {
371 switch d.opcode {
372 default:
373 panic(phasePanicMsg)
374
375 case scanBeginArray:
376 if v.IsValid() {
377 if err := d.array(v); err != nil {
378 return err
379 }
380 } else {
381 d.skip()
382 }
383 d.scanNext()
384
385 case scanBeginObject:
386 if v.IsValid() {
387 if err := d.object(v); err != nil {
388 return err
389 }
390 } else {
391 d.skip()
392 }
393 d.scanNext()
394
395 case scanBeginLiteral:
396
397 start := d.readIndex()
398 d.rescanLiteral()
399
400 if v.IsValid() {
401 if err := d.literalStore(d.data[start:d.readIndex()], v, false); err != nil {
402 return err
403 }
404 }
405 }
406 return nil
407 }
408
409 type unquotedValue struct{}
410
411
412
413
414
415 func (d *decodeState) valueQuoted() any {
416 switch d.opcode {
417 default:
418 panic(phasePanicMsg)
419
420 case scanBeginArray, scanBeginObject:
421 d.skip()
422 d.scanNext()
423
424 case scanBeginLiteral:
425 v := d.literalInterface()
426 switch v.(type) {
427 case nil, string:
428 return v
429 }
430 }
431 return unquotedValue{}
432 }
433
434
435
436
437
438
439 func indirect(v reflect.Value, decodingNull bool) (Unmarshaler, encoding.TextUnmarshaler, reflect.Value) {
440
441
442
443
444
445
446
447
448
449
450
451 v0 := v
452 haveAddr := false
453
454
455
456
457 if v.Kind() != reflect.Pointer && v.Type().Name() != "" && v.CanAddr() {
458 haveAddr = true
459 v = v.Addr()
460 }
461 for {
462
463
464 if v.Kind() == reflect.Interface && !v.IsNil() {
465 e := v.Elem()
466 if e.Kind() == reflect.Pointer && !e.IsNil() && (!decodingNull || e.Elem().Kind() == reflect.Pointer) {
467 haveAddr = false
468 v = e
469 continue
470 }
471 }
472
473 if v.Kind() != reflect.Pointer {
474 break
475 }
476
477 if decodingNull && v.CanSet() {
478 break
479 }
480
481
482
483
484 if v.Elem().Kind() == reflect.Interface && v.Elem().Elem().Equal(v) {
485 v = v.Elem()
486 break
487 }
488 if v.IsNil() {
489 v.Set(reflect.New(v.Type().Elem()))
490 }
491 if v.Type().NumMethod() > 0 && v.CanInterface() {
492 if u, ok := reflect.TypeAssert[Unmarshaler](v); ok {
493 return u, nil, reflect.Value{}
494 }
495 if !decodingNull {
496 if u, ok := reflect.TypeAssert[encoding.TextUnmarshaler](v); ok {
497 return nil, u, reflect.Value{}
498 }
499 }
500 }
501
502 if haveAddr {
503 v = v0
504 haveAddr = false
505 } else {
506 v = v.Elem()
507 }
508 }
509 return nil, nil, v
510 }
511
512
513
514 func (d *decodeState) array(v reflect.Value) error {
515
516 u, ut, pv := indirect(v, false)
517 if u != nil {
518 start := d.readIndex()
519 d.skip()
520 return u.UnmarshalJSON(d.data[start:d.off])
521 }
522 if ut != nil {
523 d.saveError(&UnmarshalTypeError{Value: "array", Type: v.Type(), Offset: int64(d.off)})
524 d.skip()
525 return nil
526 }
527 v = pv
528
529
530 switch v.Kind() {
531 case reflect.Interface:
532 if v.NumMethod() == 0 {
533
534 ai := d.arrayInterface()
535 v.Set(reflect.ValueOf(ai))
536 return nil
537 }
538
539 fallthrough
540 default:
541 d.saveError(&UnmarshalTypeError{Value: "array", Type: v.Type(), Offset: int64(d.off)})
542 d.skip()
543 return nil
544 case reflect.Array, reflect.Slice:
545 break
546 }
547
548 i := 0
549 for {
550
551 d.scanWhile(scanSkipSpace)
552 if d.opcode == scanEndArray {
553 break
554 }
555
556
557 if v.Kind() == reflect.Slice {
558 if i >= v.Cap() {
559 v.Grow(1)
560 }
561 if i >= v.Len() {
562 v.SetLen(i + 1)
563 }
564 }
565
566 if i < v.Len() {
567
568 if err := d.value(v.Index(i)); err != nil {
569 return err
570 }
571 } else {
572
573 if err := d.value(reflect.Value{}); err != nil {
574 return err
575 }
576 }
577 i++
578
579
580 if d.opcode == scanSkipSpace {
581 d.scanWhile(scanSkipSpace)
582 }
583 if d.opcode == scanEndArray {
584 break
585 }
586 if d.opcode != scanArrayValue {
587 panic(phasePanicMsg)
588 }
589 }
590
591 if i < v.Len() {
592 if v.Kind() == reflect.Array {
593 for ; i < v.Len(); i++ {
594 v.Index(i).SetZero()
595 }
596 } else {
597 v.SetLen(i)
598 }
599 }
600 if i == 0 && v.Kind() == reflect.Slice {
601 v.Set(reflect.MakeSlice(v.Type(), 0, 0))
602 }
603 return nil
604 }
605
606 var nullLiteral = []byte("null")
607 var textUnmarshalerType = reflect.TypeFor[encoding.TextUnmarshaler]()
608
609
610
611 func (d *decodeState) object(v reflect.Value) error {
612
613 u, ut, pv := indirect(v, false)
614 if u != nil {
615 start := d.readIndex()
616 d.skip()
617 return u.UnmarshalJSON(d.data[start:d.off])
618 }
619 if ut != nil {
620 d.saveError(&UnmarshalTypeError{Value: "object", Type: v.Type(), Offset: int64(d.off)})
621 d.skip()
622 return nil
623 }
624 v = pv
625 t := v.Type()
626
627
628 if v.Kind() == reflect.Interface && v.NumMethod() == 0 {
629 oi := d.objectInterface()
630 v.Set(reflect.ValueOf(oi))
631 return nil
632 }
633
634 var fields structFields
635
636
637
638
639
640 switch v.Kind() {
641 case reflect.Map:
642
643
644 switch t.Key().Kind() {
645 case reflect.String,
646 reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64,
647 reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
648 default:
649 if !reflect.PointerTo(t.Key()).Implements(textUnmarshalerType) {
650 d.saveError(&UnmarshalTypeError{Value: "object", Type: t, Offset: int64(d.off)})
651 d.skip()
652 return nil
653 }
654 }
655 if v.IsNil() {
656 v.Set(reflect.MakeMap(t))
657 }
658 case reflect.Struct:
659 fields = cachedTypeFields(t)
660
661 default:
662 d.saveError(&UnmarshalTypeError{Value: "object", Type: t, Offset: int64(d.off)})
663 d.skip()
664 return nil
665 }
666
667 var mapElem reflect.Value
668 var origErrorContext errorContext
669 if d.errorContext != nil {
670 origErrorContext = *d.errorContext
671 }
672
673 for {
674
675 d.scanWhile(scanSkipSpace)
676 if d.opcode == scanEndObject {
677
678 break
679 }
680 if d.opcode != scanBeginLiteral {
681 panic(phasePanicMsg)
682 }
683
684
685 start := d.readIndex()
686 d.rescanLiteral()
687 item := d.data[start:d.readIndex()]
688 key, ok := unquoteBytes(item)
689 if !ok {
690 panic(phasePanicMsg)
691 }
692
693
694 var subv reflect.Value
695 destring := false
696
697 if v.Kind() == reflect.Map {
698 elemType := t.Elem()
699 if !mapElem.IsValid() {
700 mapElem = reflect.New(elemType).Elem()
701 } else {
702 mapElem.SetZero()
703 }
704 subv = mapElem
705 } else {
706 f := fields.byExactName[string(key)]
707 if f == nil {
708 f = fields.byFoldedName[string(foldName(key))]
709 }
710 if f != nil {
711 subv = v
712 destring = f.quoted
713 if d.errorContext == nil {
714 d.errorContext = new(errorContext)
715 }
716 for i, ind := range f.index {
717 if subv.Kind() == reflect.Pointer {
718 if subv.IsNil() {
719
720
721
722
723
724 if !subv.CanSet() {
725 d.saveError(fmt.Errorf("json: cannot set embedded pointer to unexported struct: %v", subv.Type().Elem()))
726
727
728 subv = reflect.Value{}
729 destring = false
730 break
731 }
732 subv.Set(reflect.New(subv.Type().Elem()))
733 }
734 subv = subv.Elem()
735 }
736 if i < len(f.index)-1 {
737 d.errorContext.FieldStack = append(
738 d.errorContext.FieldStack,
739 subv.Type().Field(ind).Name,
740 )
741 }
742 subv = subv.Field(ind)
743 }
744 d.errorContext.Struct = t
745 d.errorContext.FieldStack = append(d.errorContext.FieldStack, f.name)
746 } else if d.disallowUnknownFields {
747 d.saveError(fmt.Errorf("json: unknown field %q", key))
748 }
749 }
750
751
752 if d.opcode == scanSkipSpace {
753 d.scanWhile(scanSkipSpace)
754 }
755 if d.opcode != scanObjectKey {
756 panic(phasePanicMsg)
757 }
758 d.scanWhile(scanSkipSpace)
759
760 if destring {
761 switch qv := d.valueQuoted().(type) {
762 case nil:
763 if err := d.literalStore(nullLiteral, subv, false); err != nil {
764 return err
765 }
766 case string:
767 if err := d.literalStore([]byte(qv), subv, true); err != nil {
768 return err
769 }
770 default:
771 d.saveError(fmt.Errorf("json: invalid use of ,string struct tag, trying to unmarshal unquoted value into %v", subv.Type()))
772 }
773 } else {
774 if err := d.value(subv); err != nil {
775 return err
776 }
777 }
778
779
780
781 if v.Kind() == reflect.Map {
782 kt := t.Key()
783 var kv reflect.Value
784 if reflect.PointerTo(kt).Implements(textUnmarshalerType) {
785 kv = reflect.New(kt)
786 if err := d.literalStore(item, kv, true); err != nil {
787 return err
788 }
789 kv = kv.Elem()
790 } else {
791 switch kt.Kind() {
792 case reflect.String:
793 kv = reflect.New(kt).Elem()
794 kv.SetString(string(key))
795 case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
796 s := string(key)
797 n, err := strconv.ParseInt(s, 10, 64)
798 if err != nil || kt.OverflowInt(n) {
799 d.saveError(&UnmarshalTypeError{Value: "number " + s, Type: kt, Offset: int64(start + 1)})
800 break
801 }
802 kv = reflect.New(kt).Elem()
803 kv.SetInt(n)
804 case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
805 s := string(key)
806 n, err := strconv.ParseUint(s, 10, 64)
807 if err != nil || kt.OverflowUint(n) {
808 d.saveError(&UnmarshalTypeError{Value: "number " + s, Type: kt, Offset: int64(start + 1)})
809 break
810 }
811 kv = reflect.New(kt).Elem()
812 kv.SetUint(n)
813 default:
814 panic("json: Unexpected key type")
815 }
816 }
817 if kv.IsValid() {
818 v.SetMapIndex(kv, subv)
819 }
820 }
821
822
823 if d.opcode == scanSkipSpace {
824 d.scanWhile(scanSkipSpace)
825 }
826 if d.errorContext != nil {
827
828
829
830 d.errorContext.FieldStack = d.errorContext.FieldStack[:len(origErrorContext.FieldStack)]
831 d.errorContext.Struct = origErrorContext.Struct
832 }
833 if d.opcode == scanEndObject {
834 break
835 }
836 if d.opcode != scanObjectValue {
837 panic(phasePanicMsg)
838 }
839 }
840 return nil
841 }
842
843
844
845 func (d *decodeState) convertNumber(s string) (any, error) {
846 if d.useNumber {
847 return Number(s), nil
848 }
849 f, err := strconv.ParseFloat(s, 64)
850 if err != nil {
851 return nil, &UnmarshalTypeError{Value: "number " + s, Type: reflect.TypeFor[float64](), Offset: int64(d.off)}
852 }
853 return f, nil
854 }
855
856 var numberType = reflect.TypeFor[Number]()
857
858
859
860
861
862
863 func (d *decodeState) literalStore(item []byte, v reflect.Value, fromQuoted bool) error {
864
865 if len(item) == 0 {
866
867 d.saveError(fmt.Errorf("json: invalid use of ,string struct tag, trying to unmarshal %q into %v", item, v.Type()))
868 return nil
869 }
870 isNull := item[0] == 'n'
871 u, ut, pv := indirect(v, isNull)
872 if u != nil {
873 return u.UnmarshalJSON(item)
874 }
875 if ut != nil {
876 if item[0] != '"' {
877 if fromQuoted {
878 d.saveError(fmt.Errorf("json: invalid use of ,string struct tag, trying to unmarshal %q into %v", item, v.Type()))
879 return nil
880 }
881 val := "number"
882 switch item[0] {
883 case 'n':
884 val = "null"
885 case 't', 'f':
886 val = "bool"
887 }
888 d.saveError(&UnmarshalTypeError{Value: val, Type: v.Type(), Offset: int64(d.readIndex())})
889 return nil
890 }
891 s, ok := unquoteBytes(item)
892 if !ok {
893 if fromQuoted {
894 return fmt.Errorf("json: invalid use of ,string struct tag, trying to unmarshal %q into %v", item, v.Type())
895 }
896 panic(phasePanicMsg)
897 }
898 return ut.UnmarshalText(s)
899 }
900
901 v = pv
902
903 switch c := item[0]; c {
904 case 'n':
905
906
907 if fromQuoted && string(item) != "null" {
908 d.saveError(fmt.Errorf("json: invalid use of ,string struct tag, trying to unmarshal %q into %v", item, v.Type()))
909 break
910 }
911 switch v.Kind() {
912 case reflect.Interface, reflect.Pointer, reflect.Map, reflect.Slice:
913 v.SetZero()
914
915 }
916 case 't', 'f':
917 value := item[0] == 't'
918
919
920 if fromQuoted && string(item) != "true" && string(item) != "false" {
921 d.saveError(fmt.Errorf("json: invalid use of ,string struct tag, trying to unmarshal %q into %v", item, v.Type()))
922 break
923 }
924 switch v.Kind() {
925 default:
926 if fromQuoted {
927 d.saveError(fmt.Errorf("json: invalid use of ,string struct tag, trying to unmarshal %q into %v", item, v.Type()))
928 } else {
929 d.saveError(&UnmarshalTypeError{Value: "bool", Type: v.Type(), Offset: int64(d.readIndex())})
930 }
931 case reflect.Bool:
932 v.SetBool(value)
933 case reflect.Interface:
934 if v.NumMethod() == 0 {
935 v.Set(reflect.ValueOf(value))
936 } else {
937 d.saveError(&UnmarshalTypeError{Value: "bool", Type: v.Type(), Offset: int64(d.readIndex())})
938 }
939 }
940
941 case '"':
942 s, ok := unquoteBytes(item)
943 if !ok {
944 if fromQuoted {
945 return fmt.Errorf("json: invalid use of ,string struct tag, trying to unmarshal %q into %v", item, v.Type())
946 }
947 panic(phasePanicMsg)
948 }
949 switch v.Kind() {
950 default:
951 d.saveError(&UnmarshalTypeError{Value: "string", Type: v.Type(), Offset: int64(d.readIndex())})
952 case reflect.Slice:
953 if v.Type().Elem().Kind() != reflect.Uint8 {
954 d.saveError(&UnmarshalTypeError{Value: "string", Type: v.Type(), Offset: int64(d.readIndex())})
955 break
956 }
957 b := make([]byte, base64.StdEncoding.DecodedLen(len(s)))
958 n, err := base64.StdEncoding.Decode(b, s)
959 if err != nil {
960 d.saveError(err)
961 break
962 }
963 v.SetBytes(b[:n])
964 case reflect.String:
965 t := string(s)
966 if v.Type() == numberType && !isValidNumber(t) {
967 return fmt.Errorf("json: invalid number literal, trying to unmarshal %q into Number", item)
968 }
969 v.SetString(t)
970 case reflect.Interface:
971 if v.NumMethod() == 0 {
972 v.Set(reflect.ValueOf(string(s)))
973 } else {
974 d.saveError(&UnmarshalTypeError{Value: "string", Type: v.Type(), Offset: int64(d.readIndex())})
975 }
976 }
977
978 default:
979 if c != '-' && (c < '0' || c > '9') {
980 if fromQuoted {
981 return fmt.Errorf("json: invalid use of ,string struct tag, trying to unmarshal %q into %v", item, v.Type())
982 }
983 panic(phasePanicMsg)
984 }
985 switch v.Kind() {
986 default:
987 if v.Kind() == reflect.String && v.Type() == numberType {
988
989
990 v.SetString(string(item))
991 break
992 }
993 if fromQuoted {
994 return fmt.Errorf("json: invalid use of ,string struct tag, trying to unmarshal %q into %v", item, v.Type())
995 }
996 d.saveError(&UnmarshalTypeError{Value: "number", Type: v.Type(), Offset: int64(d.readIndex())})
997 case reflect.Interface:
998 n, err := d.convertNumber(string(item))
999 if err != nil {
1000 d.saveError(err)
1001 break
1002 }
1003 if v.NumMethod() != 0 {
1004 d.saveError(&UnmarshalTypeError{Value: "number", Type: v.Type(), Offset: int64(d.readIndex())})
1005 break
1006 }
1007 v.Set(reflect.ValueOf(n))
1008
1009 case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
1010 n, err := strconv.ParseInt(string(item), 10, 64)
1011 if err != nil || v.OverflowInt(n) {
1012 d.saveError(&UnmarshalTypeError{Value: "number " + string(item), Type: v.Type(), Offset: int64(d.readIndex())})
1013 break
1014 }
1015 v.SetInt(n)
1016
1017 case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
1018 n, err := strconv.ParseUint(string(item), 10, 64)
1019 if err != nil || v.OverflowUint(n) {
1020 d.saveError(&UnmarshalTypeError{Value: "number " + string(item), Type: v.Type(), Offset: int64(d.readIndex())})
1021 break
1022 }
1023 v.SetUint(n)
1024
1025 case reflect.Float32, reflect.Float64:
1026 n, err := strconv.ParseFloat(string(item), v.Type().Bits())
1027 if err != nil || v.OverflowFloat(n) {
1028 d.saveError(&UnmarshalTypeError{Value: "number " + string(item), Type: v.Type(), Offset: int64(d.readIndex())})
1029 break
1030 }
1031 v.SetFloat(n)
1032 }
1033 }
1034 return nil
1035 }
1036
1037
1038
1039
1040
1041
1042 func (d *decodeState) valueInterface() (val any) {
1043 switch d.opcode {
1044 default:
1045 panic(phasePanicMsg)
1046 case scanBeginArray:
1047 val = d.arrayInterface()
1048 d.scanNext()
1049 case scanBeginObject:
1050 val = d.objectInterface()
1051 d.scanNext()
1052 case scanBeginLiteral:
1053 val = d.literalInterface()
1054 }
1055 return
1056 }
1057
1058
1059 func (d *decodeState) arrayInterface() []any {
1060 var v = make([]any, 0)
1061 for {
1062
1063 d.scanWhile(scanSkipSpace)
1064 if d.opcode == scanEndArray {
1065 break
1066 }
1067
1068 v = append(v, d.valueInterface())
1069
1070
1071 if d.opcode == scanSkipSpace {
1072 d.scanWhile(scanSkipSpace)
1073 }
1074 if d.opcode == scanEndArray {
1075 break
1076 }
1077 if d.opcode != scanArrayValue {
1078 panic(phasePanicMsg)
1079 }
1080 }
1081 return v
1082 }
1083
1084
1085 func (d *decodeState) objectInterface() map[string]any {
1086 m := make(map[string]any)
1087 for {
1088
1089 d.scanWhile(scanSkipSpace)
1090 if d.opcode == scanEndObject {
1091
1092 break
1093 }
1094 if d.opcode != scanBeginLiteral {
1095 panic(phasePanicMsg)
1096 }
1097
1098
1099 start := d.readIndex()
1100 d.rescanLiteral()
1101 item := d.data[start:d.readIndex()]
1102 key, ok := unquote(item)
1103 if !ok {
1104 panic(phasePanicMsg)
1105 }
1106
1107
1108 if d.opcode == scanSkipSpace {
1109 d.scanWhile(scanSkipSpace)
1110 }
1111 if d.opcode != scanObjectKey {
1112 panic(phasePanicMsg)
1113 }
1114 d.scanWhile(scanSkipSpace)
1115
1116
1117 m[key] = d.valueInterface()
1118
1119
1120 if d.opcode == scanSkipSpace {
1121 d.scanWhile(scanSkipSpace)
1122 }
1123 if d.opcode == scanEndObject {
1124 break
1125 }
1126 if d.opcode != scanObjectValue {
1127 panic(phasePanicMsg)
1128 }
1129 }
1130 return m
1131 }
1132
1133
1134
1135
1136 func (d *decodeState) literalInterface() any {
1137
1138 start := d.readIndex()
1139 d.rescanLiteral()
1140
1141 item := d.data[start:d.readIndex()]
1142
1143 switch c := item[0]; c {
1144 case 'n':
1145 return nil
1146
1147 case 't', 'f':
1148 return c == 't'
1149
1150 case '"':
1151 s, ok := unquote(item)
1152 if !ok {
1153 panic(phasePanicMsg)
1154 }
1155 return s
1156
1157 default:
1158 if c != '-' && (c < '0' || c > '9') {
1159 panic(phasePanicMsg)
1160 }
1161 n, err := d.convertNumber(string(item))
1162 if err != nil {
1163 d.saveError(err)
1164 }
1165 return n
1166 }
1167 }
1168
1169
1170
1171 func getu4(s []byte) rune {
1172 if len(s) < 6 || s[0] != '\\' || s[1] != 'u' {
1173 return -1
1174 }
1175 var r rune
1176 for _, c := range s[2:6] {
1177 switch {
1178 case '0' <= c && c <= '9':
1179 c = c - '0'
1180 case 'a' <= c && c <= 'f':
1181 c = c - 'a' + 10
1182 case 'A' <= c && c <= 'F':
1183 c = c - 'A' + 10
1184 default:
1185 return -1
1186 }
1187 r = r*16 + rune(c)
1188 }
1189 return r
1190 }
1191
1192
1193
1194 func unquote(s []byte) (t string, ok bool) {
1195 s, ok = unquoteBytes(s)
1196 t = string(s)
1197 return
1198 }
1199
1200 func unquoteBytes(s []byte) (t []byte, ok bool) {
1201 if len(s) < 2 || s[0] != '"' || s[len(s)-1] != '"' {
1202 return
1203 }
1204 s = s[1 : len(s)-1]
1205
1206
1207
1208
1209 r := 0
1210 for r < len(s) {
1211 c := s[r]
1212 if c == '\\' || c == '"' || c < ' ' {
1213 break
1214 }
1215 rr, size := utf8.DecodeRune(s[r:])
1216 if rr == utf8.RuneError && size == 1 {
1217 break
1218 }
1219 r += size
1220 }
1221 if r == len(s) {
1222 return s, true
1223 }
1224
1225 b := make([]byte, len(s)+2*utf8.UTFMax)
1226 w := copy(b, s[0:r])
1227 for r < len(s) {
1228
1229
1230
1231 if w >= len(b)-2*utf8.UTFMax {
1232 nb := make([]byte, (len(b)+utf8.UTFMax)*2)
1233 copy(nb, b[0:w])
1234 b = nb
1235 }
1236 switch c := s[r]; {
1237 case c == '\\':
1238 r++
1239 if r >= len(s) {
1240 return
1241 }
1242 switch s[r] {
1243 default:
1244 return
1245 case '"', '\\', '/', '\'':
1246 b[w] = s[r]
1247 r++
1248 w++
1249 case 'b':
1250 b[w] = '\b'
1251 r++
1252 w++
1253 case 'f':
1254 b[w] = '\f'
1255 r++
1256 w++
1257 case 'n':
1258 b[w] = '\n'
1259 r++
1260 w++
1261 case 'r':
1262 b[w] = '\r'
1263 r++
1264 w++
1265 case 't':
1266 b[w] = '\t'
1267 r++
1268 w++
1269 case 'u':
1270 r--
1271 rr := getu4(s[r:])
1272 if rr < 0 {
1273 return
1274 }
1275 r += 6
1276 if utf16.IsSurrogate(rr) {
1277 rr1 := getu4(s[r:])
1278 if dec := utf16.DecodeRune(rr, rr1); dec != unicode.ReplacementChar {
1279
1280 r += 6
1281 w += utf8.EncodeRune(b[w:], dec)
1282 break
1283 }
1284
1285 rr = unicode.ReplacementChar
1286 }
1287 w += utf8.EncodeRune(b[w:], rr)
1288 }
1289
1290
1291 case c == '"', c < ' ':
1292 return
1293
1294
1295 case c < utf8.RuneSelf:
1296 b[w] = c
1297 r++
1298 w++
1299
1300
1301 default:
1302 rr, size := utf8.DecodeRune(s[r:])
1303 r += size
1304 w += utf8.EncodeRune(b[w:], rr)
1305 }
1306 }
1307 return b[0:w], true
1308 }
1309
View as plain text