aboutsummaryrefslogtreecommitdiff
path: root/src/pkg/encoding
diff options
context:
space:
mode:
authorRuss Cox <rsc@golang.org>2013-07-12 17:42:01 -0400
committerRuss Cox <rsc@golang.org>2013-07-12 17:42:01 -0400
commit4419d7e53cba0d897c5962af4ad1dd0b4aaf0b21 (patch)
tree48024b021b6d0da8d31c4ccbd1867399d5672619 /src/pkg/encoding
parent64054a40ad0d85e82f77a4982ea4ee08c3cea40a (diff)
downloadgo-4419d7e53cba0d897c5962af4ad1dd0b4aaf0b21.tar.xz
undo CL 11161044 / ba455262a9db
I want to think more carefully about this. We put this in because Marshal encoded named []byte but Unmarshal rejected them. And we noticed that Marshal's behavior was undocumented so we documented it. But I am starting to think the docs and Unmarshal were correct and Marshal's behavior was the problem. Rolling back to give us more time to think. ««« original CL description 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 »»» R=golang-dev, r CC=golang-dev https://golang.org/cl/11042046
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, 3 insertions, 32 deletions
diff --git a/src/pkg/encoding/json/decode.go b/src/pkg/encoding/json/decode.go
index e608ef4a61..62ac294b89 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().Elem().Kind() != reflect.Uint8 {
+ if v.Type() != byteSliceType {
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 dfc688cdc4..65e6d6ec38 100644
--- a/src/pkg/encoding/json/decode_test.go
+++ b/src/pkg/encoding/json/decode_test.go
@@ -1186,32 +1186,3 @@ 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 7cc9398c97..be4a7b1fa6 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 a slice of
-// bytes encodes as a base64-encoded string, and a nil slice
+// Array and slice values encode as JSON arrays, except that
+// []byte 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