diff --git a/dec_arr.go b/dec_arr.go index 497248a..6040e79 100644 --- a/dec_arr.go +++ b/dec_arr.go @@ -33,16 +33,14 @@ func (d *Decoder) Elem() (ok bool, err error) { } } -func skipArr(d *Decoder) error { return d.Skip() } - // Arr decodes array and invokes callback on each array element. func (d *Decoder) Arr(f func(d *Decoder) error) error { - if f == nil { - f = skipArr - } if err := d.consume('['); err != nil { return errors.Wrap(err, "start") } + if f == nil { + return d.skipArr() + } if err := d.incDepth(); err != nil { return errors.Wrap(err, "inc") } diff --git a/dec_skip.go b/dec_skip.go index 477bee8..da158e8 100644 --- a/dec_skip.go +++ b/dec_skip.go @@ -408,7 +408,38 @@ func (d *Decoder) skipObj() error { } } +// skipArr reads JSON array. +// +// Assumes first bracket was consumed. func (d *Decoder) skipArr() error { + if err := d.incDepth(); err != nil { + return errors.Wrap(err, "inc") + } + + c, err := d.more() + if err != nil { + return errors.Wrap(err, "next") + } + if c == ']' { + return d.decDepth() + } d.unread() - return d.Arr(nil) + + for { + if err := d.Skip(); err != nil { + return err + } + c, err := d.more() + if err != nil { + return errors.Wrap(err, "read comma") + } + switch c { + case ',': + continue + case ']': + return d.decDepth() + default: + return badToken(c) + } + } }