diff --git a/src/encoding/json/decode_test.go b/src/encoding/json/decode_test.go
index 473fd02..d6568c8 100644
--- a/src/encoding/json/decode_test.go
+++ b/src/encoding/json/decode_test.go
@@ -12,6 +12,7 @@
"errors"
"fmt"
"image"
+ "io"
"maps"
"math"
"math/big"
@@ -469,6 +470,8 @@
{CaseName: Name(""), in: `{"alphabet": "xyz"}`, ptr: new(U), err: fmt.Errorf("json: unknown field \"alphabet\""), disallowUnknownFields: true},
// syntax errors
+ {CaseName: Name(""), in: ``, ptr: new(bool), err: &SyntaxError{"unexpected end of JSON input", 0}},
+ {CaseName: Name(""), in: " \n\r\t", ptr: new(bool), err: &SyntaxError{"unexpected end of JSON input", 4}},
{CaseName: Name(""), in: `{"X": "foo", "Y"}`, err: &SyntaxError{"invalid character '}' after object key", 17}},
{CaseName: Name(""), in: `[1, 2, 3+]`, err: &SyntaxError{"invalid character '+' after array element", 9}},
{CaseName: Name(""), in: `{"X":12x}`, err: &SyntaxError{"invalid character 'x' after object key:value pair", 8}, useNumber: true},
@@ -1377,6 +1380,9 @@
if tt.disallowUnknownFields {
dec.DisallowUnknownFields()
}
+ if strings.TrimSpace(tt.in) == "" && tt.err != nil {
+ tt.err = io.EOF // in streaming mode, we expect EOF instead
+ }
if err := dec.Decode(v.Interface()); !equalError(err, tt.err) {
t.Fatalf("%s: Decode error:\n\tgot: %v\n\twant: %v\n\n\tgot: %#v\n\twant: %#v", tt.Where, err, tt.err, err, tt.err)
} else if err != nil && tt.out == nil {
diff --git a/src/encoding/json/v2/arshal.go b/src/encoding/json/v2/arshal.go
index 10b16ef..5cd2106 100644
--- a/src/encoding/json/v2/arshal.go
+++ b/src/encoding/json/v2/arshal.go
@@ -438,7 +438,8 @@
case nil:
return export.Decoder(in).CheckEOF()
case io.EOF:
- return io.ErrUnexpectedEOF
+ offset := in.InputOffset() + int64(len(in.UnreadBuffer()))
+ return &jsontext.SyntacticError{ByteOffset: offset, Err: io.ErrUnexpectedEOF}
default:
return err
}
diff --git a/src/encoding/json/v2/arshal_test.go b/src/encoding/json/v2/arshal_test.go
index 8494deed..879a2f3 100644
--- a/src/encoding/json/v2/arshal_test.go
+++ b/src/encoding/json/v2/arshal_test.go
@@ -7138,7 +7138,13 @@
inBuf: ``,
inVal: addr(structAll{}),
want: addr(structAll{}),
- wantErr: io.ErrUnexpectedEOF,
+ wantErr: &jsontext.SyntacticError{Err: io.ErrUnexpectedEOF},
+ }, {
+ name: jsontest.Name("Structs/Invalid/ErrUnexpectedEOF"),
+ inBuf: " \n\r\t",
+ inVal: addr(structAll{}),
+ want: addr(structAll{}),
+ wantErr: &jsontext.SyntacticError{Err: io.ErrUnexpectedEOF, ByteOffset: len64(" \n\r\t")},
}, {
name: jsontest.Name("Structs/Invalid/NestedErrUnexpectedEOF"),
inBuf: `{"Pointer":`,
diff --git a/src/encoding/json/v2_decode_test.go b/src/encoding/json/v2_decode_test.go
index 3ab20e2..f140467 100644
--- a/src/encoding/json/v2_decode_test.go
+++ b/src/encoding/json/v2_decode_test.go
@@ -12,6 +12,7 @@
"errors"
"fmt"
"image"
+ "io"
"maps"
"math"
"math/big"
@@ -473,6 +474,8 @@
{CaseName: Name(""), in: `{"alphabet": "xyz"}`, ptr: new(U), err: fmt.Errorf("json: unknown field \"alphabet\""), disallowUnknownFields: true},
// syntax errors
+ {CaseName: Name(""), in: ``, ptr: new(bool), err: &SyntaxError{"unexpected end of JSON input", 0}},
+ {CaseName: Name(""), in: " \n\r\t", ptr: new(bool), err: &SyntaxError{"unexpected end of JSON input", 4}},
{CaseName: Name(""), in: `{"X": "foo", "Y"}`, err: &SyntaxError{"invalid character '}' after object key", len64(`{"X": "foo", "Y"`)}},
{CaseName: Name(""), in: `[1, 2, 3+]`, err: &SyntaxError{"invalid character '+' after array element", len64(`[1, 2, 3`)}},
{CaseName: Name(""), in: `{"X":12x}`, err: &SyntaxError{"invalid character 'x' after object key:value pair", len64(`{"X":12`)}, useNumber: true},
@@ -1382,6 +1385,9 @@
if tt.disallowUnknownFields {
dec.DisallowUnknownFields()
}
+ if strings.TrimSpace(tt.in) == "" && tt.err != nil {
+ tt.err = io.EOF // in streaming mode, we expect EOF instead
+ }
if err := dec.Decode(v.Interface()); !equalError(err, tt.err) {
t.Fatalf("%s: Decode error:\n\tgot: %v\n\twant: %v\n\n\tgot: %#v\n\twant: %#v", tt.Where, err, tt.err, err, tt.err)
} else if err != nil && tt.out == nil {
diff --git a/src/encoding/json/v2_scanner.go b/src/encoding/json/v2_scanner.go
index 475bf58..aef045f 100644
--- a/src/encoding/json/v2_scanner.go
+++ b/src/encoding/json/v2_scanner.go
@@ -30,6 +30,10 @@
xd := export.Decoder(d)
xd.Struct.Flags.Set(jsonflags.AllowDuplicateNames | jsonflags.AllowInvalidUTF8 | 1)
if _, err := d.ReadValue(); err != nil {
+ if err == io.EOF {
+ offset := d.InputOffset() + int64(len(d.UnreadBuffer()))
+ err = &jsontext.SyntacticError{ByteOffset: offset, Err: io.ErrUnexpectedEOF}
+ }
return transformSyntacticError(err)
}
if err := xd.CheckEOF(); err != nil {