diff options
| author | Joe Tsai <joetsai@digital-static.net> | 2025-07-09 16:55:14 -0700 |
|---|---|---|
| committer | Gopher Robot <gobot@golang.org> | 2025-07-11 14:27:16 -0700 |
| commit | a0a99cb22b2045b15509d1002a655db407a44a50 (patch) | |
| tree | 9d60e11f8039dcc6c3141c2eade1c58a8a4c73e3 /src/encoding/json/v2_stream.go | |
| parent | 9d04122d240db4de36bf9ef4f5627e0025201bd9 (diff) | |
| download | go-a0a99cb22b2045b15509d1002a655db407a44a50.tar.xz | |
encoding/json/v2: report wrapped io.ErrUnexpectedEOF
In the event that the input is just JSON whitespace,
the underlying jsontext.Decoder treats this as an empty stream
and reports io.EOF.
The logic in unmarshalFull simply casted io.EOF as io.ErrUnexpectedEOF,
which is inconsistent with how all other io.ErrUnexpectedEOF are reported,
which are wrapped within a jsontext.SyntacticError.
Do the same thing for consistency.
We add a v1 test (without goexperiment.jsonv2) to verify that
the behavior is identical to how v1 has always behaved.
We add a v1in2 test (with goexperiment.jsonv2) to verify that
the v1in2 behavior correctly replicates historical v1 behavior.
We also fix a faulty check in v1 Decoder.Decode,
where it tried to detect errUnexpectedEnd and
return an unwrapped io.ErrUnexpectedEOF error.
This is the exact semantic that v1 has always done
in streaming Decoder.Decode (but not non-streaming Unmarshal).
There is a prior bug reported in #25956 about this inconsistency,
but we aim to preserve historical v1 behavior to reduce
the probability of churn when v1 is re-implemented in terms of v2.
Fixes #74548
Change-Id: Ibca52c3699ff3c09141e081c85f853781a86ec8e
Reviewed-on: https://go-review.googlesource.com/c/go/+/687115
Auto-Submit: Joseph Tsai <joetsai@digital-static.net>
Reviewed-by: Carlos Amedee <carlos@golang.org>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Damien Neil <dneil@google.com>
Diffstat (limited to 'src/encoding/json/v2_stream.go')
| -rw-r--r-- | src/encoding/json/v2_stream.go | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/src/encoding/json/v2_stream.go b/src/encoding/json/v2_stream.go index d58bafbfd0..ccbef6077b 100644 --- a/src/encoding/json/v2_stream.go +++ b/src/encoding/json/v2_stream.go @@ -68,7 +68,7 @@ func (dec *Decoder) Decode(v any) error { b, err := dec.dec.ReadValue() if err != nil { dec.err = transformSyntacticError(err) - if dec.err == errUnexpectedEnd { + if dec.err.Error() == errUnexpectedEnd.Error() { // NOTE: Decode has always been inconsistent with Unmarshal // with regard to the exact error value for truncated input. dec.err = io.ErrUnexpectedEOF |
