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