aboutsummaryrefslogtreecommitdiff
path: root/src/encoding/json/decode_test.go
diff options
context:
space:
mode:
authorJoe Tsai <joetsai@digital-static.net>2025-10-06 12:56:29 -0700
committerJoseph Tsai <joetsai@digital-static.net>2025-10-10 18:03:36 -0700
commitb497a29d25b0f6f29bedaa92ac1d40a1ee5c0956 (patch)
tree07ed48d5f97abb6ef8e9de1fc48e12fbc1f7ac96 /src/encoding/json/decode_test.go
parent48bb7a61147c397d0f45c10bc21ba12fa9cec0ad (diff)
downloadgo-b497a29d25b0f6f29bedaa92ac1d40a1ee5c0956.tar.xz
encoding/json: fix regression in quoted numbers under goexperiment.jsonv2
The legacy parsing of quoted numbers in v1 was according to the Go grammar for a number, rather than the JSON grammar for a number. The former is a superset of the latter. This is a historical mistake, but usages exist that depend on it. We already have branches for StringifyWithLegacySemantics to handle quoted nulls, so we can expand it to handle this. Fixes #75619 Change-Id: Ic07802539b7cbe0e1f53bd0f7e9bb344a8447203 Reviewed-on: https://go-review.googlesource.com/c/go/+/709615 Reviewed-by: Damien Neil <dneil@google.com> Auto-Submit: Joseph Tsai <joetsai@digital-static.net> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Michael Pratt <mpratt@google.com>
Diffstat (limited to 'src/encoding/json/decode_test.go')
-rw-r--r--src/encoding/json/decode_test.go56
1 files changed, 56 insertions, 0 deletions
diff --git a/src/encoding/json/decode_test.go b/src/encoding/json/decode_test.go
index d12495f90b..0b26b8eb91 100644
--- a/src/encoding/json/decode_test.go
+++ b/src/encoding/json/decode_test.go
@@ -1237,6 +1237,62 @@ var unmarshalTests = []struct {
out: (chan int)(nil),
err: &UnmarshalTypeError{Value: "number", Type: reflect.TypeFor[chan int](), Offset: 1},
},
+
+ // #75619
+ {
+ CaseName: Name("QuotedInt/GoSyntax"),
+ in: `{"X": "-0000123"}`,
+ ptr: new(struct {
+ X int64 `json:",string"`
+ }),
+ out: struct {
+ X int64 `json:",string"`
+ }{-123},
+ },
+ {
+ CaseName: Name("QuotedInt/Invalid"),
+ in: `{"X": "123 "}`,
+ ptr: new(struct {
+ X int64 `json:",string"`
+ }),
+ err: &UnmarshalTypeError{Value: "number 123 ", Type: reflect.TypeFor[int64](), Field: "X", Offset: int64(len(`{"X": "123 "`))},
+ },
+ {
+ CaseName: Name("QuotedUint/GoSyntax"),
+ in: `{"X": "0000123"}`,
+ ptr: new(struct {
+ X uint64 `json:",string"`
+ }),
+ out: struct {
+ X uint64 `json:",string"`
+ }{123},
+ },
+ {
+ CaseName: Name("QuotedUint/Invalid"),
+ in: `{"X": "0x123"}`,
+ ptr: new(struct {
+ X uint64 `json:",string"`
+ }),
+ err: &UnmarshalTypeError{Value: "number 0x123", Type: reflect.TypeFor[uint64](), Field: "X", Offset: int64(len(`{"X": "0x123"`))},
+ },
+ {
+ CaseName: Name("QuotedFloat/GoSyntax"),
+ in: `{"X": "0x1_4p-2"}`,
+ ptr: new(struct {
+ X float64 `json:",string"`
+ }),
+ out: struct {
+ X float64 `json:",string"`
+ }{0x1_4p-2},
+ },
+ {
+ CaseName: Name("QuotedFloat/Invalid"),
+ in: `{"X": "1.5e1_"}`,
+ ptr: new(struct {
+ X float64 `json:",string"`
+ }),
+ err: &UnmarshalTypeError{Value: "number 1.5e1_", Type: reflect.TypeFor[float64](), Field: "X", Offset: int64(len(`{"X": "1.5e1_"`))},
+ },
}
func TestMarshal(t *testing.T) {