diff options
Diffstat (limited to 'decode.go')
-rw-r--r-- | decode.go | 29 |
1 files changed, 29 insertions, 0 deletions
@@ -121,6 +121,26 @@ func Decode(r interface { return NewDecoder(r).Decode(ptr) } +// DecodeThenEOF is like decode, but emits an error if there is extra data after the JSON. +func DecodeThenEOF(r interface { + io.Reader + io.RuneScanner +}, ptr any) error { + dec := NewDecoder(r) + if err := dec.Decode(ptr); err != nil { + return err + } + if c, _, err := r.ReadRune(); err == nil { + return &DecodeError{ + Err: &DecodeSyntaxError{ + Err: fmt.Errorf("invalid character %q after top-level value", c), + Offset: dec.InputOffset(), + }, + } + } + return nil +} + func (dec *Decoder) Decode(ptr any) (err error) { ptrVal := reflect.ValueOf(ptr) if ptrVal.Kind() != reflect.Pointer || ptrVal.IsNil() || !ptrVal.Elem().CanSet() { @@ -147,6 +167,15 @@ func (dec *Decoder) Decode(ptr any) (err error) { } }() dec.decode(ptrVal.Elem(), false) + for { + _, s, t, _ := dec.io.ReadRuneType() + if t == RuneTypeEOF || t == RuneTypeError { + if s > 0 { + dec.io.UnreadRune() + } + break + } + } return nil } |