aboutsummaryrefslogtreecommitdiff
path: root/src/pkg/encoding
diff options
context:
space:
mode:
authorPaul Borman <borman@google.com>2013-07-11 22:34:09 -0400
committerRuss Cox <rsc@golang.org>2013-07-11 22:34:09 -0400
commit59306493067a6ebcc50bc9dfd4a1d1af543bd2d8 (patch)
tree80b509297f44ab23682b9f48035ebdd1bb44d45c /src/pkg/encoding
parent09e72f5670664539a4f01c60faea4a366d2a0fb8 (diff)
downloadgo-59306493067a6ebcc50bc9dfd4a1d1af543bd2d8.tar.xz
json: unmarshal types that are byte slices.
The json package cheerfully would marshal type S struct { IP net.IP } but would give an error when unmarshalling. This change allows any type whose concrete type is a byte slice to be unmarshalled from a string. Fixes #5086. R=golang-dev, rsc CC=golang-dev https://golang.org/cl/11161044
Diffstat (limited to 'src/pkg/encoding')
-rw-r--r--src/pkg/encoding/json/decode.go2
-rw-r--r--src/pkg/encoding/json/decode_test.go29
-rw-r--r--src/pkg/encoding/json/encode.go4
3 files changed, 32 insertions, 3 deletions
diff --git a/src/pkg/encoding/json/decode.go b/src/pkg/encoding/json/decode.go
index 62ac294b89..e608ef4a61 100644
--- a/src/pkg/encoding/json/decode.go
+++ b/src/pkg/encoding/json/decode.go
@@ -660,7 +660,7 @@ func (d *decodeState) literalStore(item []byte, v reflect.Value, fromQuoted bool
default:
d.saveError(&UnmarshalTypeError{"string", v.Type()})
case reflect.Slice:
- if v.Type() != byteSliceType {
+ if v.Type().Elem().Kind() != reflect.Uint8 {
d.saveError(&UnmarshalTypeError{"string", v.Type()})
break
}
diff --git a/src/pkg/encoding/json/decode_test.go b/src/pkg/encoding/json/decode_test.go
index f845f69ab7..97cbb4f09b 100644
--- a/src/pkg/encoding/json/decode_test.go
+++ b/src/pkg/encoding/json/decode_test.go
@@ -1191,3 +1191,32 @@ func TestSkipArrayObjects(t *testing.T) {
t.Errorf("got error %q, want nil", err)
}
}
+
+// Test that types of byte slices (such as net.IP) both
+// marshal and unmarshal.
+func TestByteSliceType(t *testing.T) {
+ type A []byte
+ type S struct {
+ A A
+ }
+
+ for x, in := range []S{
+ S{},
+ S{A: []byte{'1'}},
+ S{A: []byte{'1', '2', '3', '4', '5'}},
+ } {
+ data, err := Marshal(&in)
+ if err != nil {
+ t.Errorf("#%d: got Marshal error %q, want nil", x, err)
+ continue
+ }
+ var out S
+ err = Unmarshal(data, &out)
+ if err != nil {
+ t.Fatalf("#%d: got Unmarshal error %q, want nil", x, err)
+ }
+ if !reflect.DeepEqual(&out, &in) {
+ t.Fatalf("#%d: got %v, want %v", x, &out, &in)
+ }
+ }
+}
diff --git a/src/pkg/encoding/json/encode.go b/src/pkg/encoding/json/encode.go
index ffe903a546..e25a9b8805 100644
--- a/src/pkg/encoding/json/encode.go
+++ b/src/pkg/encoding/json/encode.go
@@ -44,8 +44,8 @@ import (
// The angle brackets "<" and ">" are escaped to "\u003c" and "\u003e"
// to keep some browsers from misinterpreting JSON output as HTML.
//
-// Array and slice values encode as JSON arrays, except that
-// []byte encodes as a base64-encoded string, and a nil slice
+// Array and slice values encode as JSON arrays, except that a slice of
+// bytes encodes as a base64-encoded string, and a nil slice
// encodes as the null JSON object.
//
// Struct values encode as JSON objects. Each exported struct field