diff --git a/internal/reflectbuild/reflectbuild.go b/internal/reflectbuild/reflectbuild.go index d2ce732..4a67797 100644 --- a/internal/reflectbuild/reflectbuild.go +++ b/internal/reflectbuild/reflectbuild.go @@ -490,6 +490,21 @@ func (b *Builder) Set(v reflect.Value) error { return t.set(v) } +// EnsureSlice makes sure that the cursor points to a non-nil slice. +func (b *Builder) EnsureSlice() error { + t := b.top() + v := t.get() + if v.Kind() != reflect.Slice { + return IncorrectKindError{Actual: v.Kind(), Expected: reflect.Slice} + } + + if v.IsNil() { + v.Set(reflect.MakeSlice(v.Type(), 0, 0)) + } + + return nil +} + func checkKindInt(rt reflect.Type) error { switch rt.Kind() { case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: diff --git a/unmarshal.go b/unmarshal.go index 43f8a94..3dd4559 100644 --- a/unmarshal.go +++ b/unmarshal.go @@ -65,6 +65,10 @@ func (u *unmarshaler) ArrayBegin() { return } u.builder.Save() + u.err = u.builder.EnsureSlice() + if u.err != nil { + return + } if u.assign { u.assign = false } else {