MCPcopy Create free account
hub / github.com/blues/note / object

Method object

jsonxt/decode.go:606–824  ·  view source on GitHub ↗

object consumes an object from d.data[d.off-1:], decoding into v. The first byte ('{') of the object has been read already.

(v reflect.Value)

Source from the content-addressed store, hash-verified

604// object consumes an object from d.data[d.off-1:], decoding into v.
605// The first byte ('{') of the object has been read already.
606func (d *decodeState) object(v reflect.Value) error {
607 // Check for unmarshaler.
608 u, ut, pv := indirect(v, false)
609 if u != nil {
610 start := d.readIndex()
611 d.skip()
612 return u.UnmarshalJSON(d.data[start:d.off])
613 }
614 if ut != nil {
615 d.saveError(&UnmarshalTypeError{Value: "object", Type: v.Type(), Offset: int64(d.off)})
616 d.skip()
617 return nil
618 }
619 v = pv
620 t := v.Type()
621
622 // Decoding into nil interface? Switch to non-reflect code.
623 if v.Kind() == reflect.Interface && v.NumMethod() == 0 {
624 oi := d.objectInterface()
625 v.Set(reflect.ValueOf(oi))
626 return nil
627 }
628
629 var fields []field
630
631 // Check type of target:
632 // struct or
633 // map[T1]T2 where T1 is string, an integer type,
634 // or an encoding.TextUnmarshaler
635 switch v.Kind() {
636 case reflect.Map:
637 // Map key must either have string kind, have an integer kind,
638 // or be an encoding.TextUnmarshaler.
639 switch t.Key().Kind() {
640 case reflect.String,
641 reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64,
642 reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
643 default:
644 if !reflect.PointerTo(t.Key()).Implements(textUnmarshalerType) {
645 d.saveError(&UnmarshalTypeError{Value: "object", Type: t, Offset: int64(d.off)})
646 d.skip()
647 return nil
648 }
649 }
650 if v.IsNil() {
651 v.Set(reflect.MakeMap(t))
652 }
653 case reflect.Struct:
654 fields = cachedTypeFields(t)
655 // ok
656 default:
657 d.saveError(&UnmarshalTypeError{Value: "object", Type: t, Offset: int64(d.off)})
658 d.skip()
659 return nil
660 }
661
662 var mapElem reflect.Value
663 originalErrorContext := d.errorContext

Callers 1

valueMethod · 0.95

Calls 12

readIndexMethod · 0.95
skipMethod · 0.95
saveErrorMethod · 0.95
objectInterfaceMethod · 0.95
scanWhileMethod · 0.95
valueQuotedMethod · 0.95
literalStoreMethod · 0.95
valueMethod · 0.95
indirectFunction · 0.85
cachedTypeFieldsFunction · 0.85
unquoteBytesFunction · 0.85
UnmarshalJSONMethod · 0.65

Tested by

no test coverage detected