func()

in document/json/decoder.go [236:272]


func (d *Decoder) decodeJSONArray(tv []interface{}, rv reflect.Value) error {
	var isArray bool

	switch rv.Kind() {
	case reflect.Slice:
		// Make room for the slice elements if needed
		if rv.IsNil() || rv.Cap() < len(tv) {
			rv.Set(reflect.MakeSlice(rv.Type(), 0, len(tv)))
		}
	case reflect.Array:
		// Limited to capacity of existing array.
		isArray = true
	case reflect.Interface:
		s := make([]interface{}, len(tv))
		for i, av := range tv {
			if err := d.decode(av, reflect.ValueOf(&s[i]).Elem(), serde.Tag{}); err != nil {
				return err
			}
		}
		rv.Set(reflect.ValueOf(s))
		return nil
	default:
		return &document.UnmarshalTypeError{Value: "list", Type: rv.Type()}
	}

	// If rv is not a slice, array
	for i := 0; i < rv.Cap() && i < len(tv); i++ {
		if !isArray {
			rv.SetLen(i + 1)
		}
		if err := d.decode(tv[i], rv.Index(i), serde.Tag{}); err != nil {
			return err
		}
	}

	return nil
}