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)
| 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. |
| 606 | func (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 |
no test coverage detected