From ed3d6727661250883c3c7e9a5b60d59a01cfa42e Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Wed, 8 Nov 2017 07:16:07 -0800 Subject: [PATCH] encoding/json: permit encoding uintptr as a string Fixes #22629 Change-Id: I31e85f9faa125ee0dfd6d3c5fa89334b00d61e6e Reviewed-on: https://go-review.googlesource.com/76530 Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot Reviewed-by: Emmanuel Odeke Reviewed-by: Joe Tsai --- src/encoding/json/decode_test.go | 42 +++++++++++++++++--------------- src/encoding/json/encode.go | 2 +- src/encoding/json/encode_test.go | 9 ++++--- 3 files changed, 30 insertions(+), 23 deletions(-) diff --git a/src/encoding/json/decode_test.go b/src/encoding/json/decode_test.go index 9ac2b14b13..fc546bf2a7 100644 --- a/src/encoding/json/decode_test.go +++ b/src/encoding/json/decode_test.go @@ -1193,7 +1193,8 @@ type All struct { Foo string `json:"bar"` Foo2 string `json:"bar2,dummyopt"` - IntStr int64 `json:",string"` + IntStr int64 `json:",string"` + UintptrStr uintptr `json:",string"` PBool *bool PInt *int @@ -1247,24 +1248,25 @@ type Small struct { } var allValue = All{ - Bool: true, - Int: 2, - Int8: 3, - Int16: 4, - Int32: 5, - Int64: 6, - Uint: 7, - Uint8: 8, - Uint16: 9, - Uint32: 10, - Uint64: 11, - Uintptr: 12, - Float32: 14.1, - Float64: 15.1, - Foo: "foo", - Foo2: "foo2", - IntStr: 42, - String: "16", + Bool: true, + Int: 2, + Int8: 3, + Int16: 4, + Int32: 5, + Int64: 6, + Uint: 7, + Uint8: 8, + Uint16: 9, + Uint32: 10, + Uint64: 11, + Uintptr: 12, + Float32: 14.1, + Float64: 15.1, + Foo: "foo", + Foo2: "foo2", + IntStr: 42, + UintptrStr: 44, + String: "16", Map: map[string]Small{ "17": {Tag: "tag17"}, "18": {Tag: "tag18"}, @@ -1326,6 +1328,7 @@ var allValueIndent = `{ "bar": "foo", "bar2": "foo2", "IntStr": "42", + "UintptrStr": "44", "PBool": null, "PInt": null, "PInt8": null, @@ -1418,6 +1421,7 @@ var pallValueIndent = `{ "bar": "", "bar2": "", "IntStr": "0", + "UintptrStr": "0", "PBool": true, "PInt": 2, "PInt8": 3, diff --git a/src/encoding/json/encode.go b/src/encoding/json/encode.go index 3f7a8d0175..317a5a940d 100644 --- a/src/encoding/json/encode.go +++ b/src/encoding/json/encode.go @@ -1131,7 +1131,7 @@ func typeFields(t reflect.Type) []field { switch ft.Kind() { case reflect.Bool, reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, - reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, + reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr, reflect.Float32, reflect.Float64, reflect.String: quoted = true diff --git a/src/encoding/json/encode_test.go b/src/encoding/json/encode_test.go index db89d113da..0f194e13d2 100644 --- a/src/encoding/json/encode_test.go +++ b/src/encoding/json/encode_test.go @@ -71,14 +71,16 @@ func TestOmitEmpty(t *testing.T) { } type StringTag struct { - BoolStr bool `json:",string"` - IntStr int64 `json:",string"` - StrStr string `json:",string"` + BoolStr bool `json:",string"` + IntStr int64 `json:",string"` + UintptrStr uintptr `json:",string"` + StrStr string `json:",string"` } var stringTagExpected = `{ "BoolStr": "true", "IntStr": "42", + "UintptrStr": "44", "StrStr": "\"xzbit\"" }` @@ -86,6 +88,7 @@ func TestStringTag(t *testing.T) { var s StringTag s.BoolStr = true s.IntStr = 42 + s.UintptrStr = 44 s.StrStr = "xzbit" got, err := MarshalIndent(&s, "", " ") if err != nil {