From c60707b14d6be26bf4213114d13070bff00d0b0a Mon Sep 17 00:00:00 2001 From: =?utf8?q?H=C3=A5vard=20Haugen?= Date: Sun, 25 Oct 2015 22:42:41 +0100 Subject: [PATCH] encoding/json: use reflect.SetBytes when decoding bytes This allows slices of custom types with byte as underlying type to be decoded, fixing a regression introduced in CL 9371. Fixes #12921. Change-Id: I62a715eaeaaa912b6bc599e94f9981a9ba5cb242 Reviewed-on: https://go-review.googlesource.com/16303 Reviewed-by: Ian Lance Taylor Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot --- src/encoding/json/decode.go | 2 +- src/encoding/json/decode_test.go | 21 +++++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/encoding/json/decode.go b/src/encoding/json/decode.go index e7e8d0b997..bd939b4258 100644 --- a/src/encoding/json/decode.go +++ b/src/encoding/json/decode.go @@ -757,7 +757,7 @@ func (d *decodeState) literalStore(item []byte, v reflect.Value, fromQuoted bool d.saveError(err) break } - v.Set(reflect.ValueOf(b[0:n])) + v.SetBytes(b[:n]) case reflect.String: v.SetString(string(s)) case reflect.Interface: diff --git a/src/encoding/json/decode_test.go b/src/encoding/json/decode_test.go index 0ed3b51628..9546ae459c 100644 --- a/src/encoding/json/decode_test.go +++ b/src/encoding/json/decode_test.go @@ -1253,6 +1253,27 @@ func TestByteKind(t *testing.T) { } } +// The fix for issue 8962 introduced a regression. +// Issue 12921. +func TestSliceOfCustomByte(t *testing.T) { + type Uint8 uint8 + + a := []Uint8("hello") + + data, err := Marshal(a) + if err != nil { + t.Fatal(err) + } + var b []Uint8 + err = Unmarshal(data, &b) + if err != nil { + t.Fatal(err) + } + if !reflect.DeepEqual(a, b) { + t.Fatal("expected %v == %v", a, b) + } +} + var decodeTypeErrorTests = []struct { dest interface{} src string -- 2.48.1