From: HÃ¥vard Haugen Date: Sun, 25 Oct 2015 21:42:41 +0000 (+0100) Subject: encoding/json: use reflect.SetBytes when decoding bytes X-Git-Tag: go1.6beta1~449 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=c60707b14d6be26bf4213114d13070bff00d0b0a;p=gostls13.git 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 --- 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