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
}