Commit 4419d7e5 authored by Russ Cox's avatar Russ Cox

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
parent 64054a40
......@@ -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
}
......
......@@ -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)
}
}
}
......@@ -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
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment