mirror of
https://github.com/golang/go
synced 2024-11-22 21:10:03 -07:00
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
This commit is contained in:
parent
09e72f5670
commit
5930649306
@ -660,7 +660,7 @@ func (d *decodeState) literalStore(item []byte, v reflect.Value, fromQuoted bool
|
|||||||
default:
|
default:
|
||||||
d.saveError(&UnmarshalTypeError{"string", v.Type()})
|
d.saveError(&UnmarshalTypeError{"string", v.Type()})
|
||||||
case reflect.Slice:
|
case reflect.Slice:
|
||||||
if v.Type() != byteSliceType {
|
if v.Type().Elem().Kind() != reflect.Uint8 {
|
||||||
d.saveError(&UnmarshalTypeError{"string", v.Type()})
|
d.saveError(&UnmarshalTypeError{"string", v.Type()})
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
@ -1191,3 +1191,32 @@ func TestSkipArrayObjects(t *testing.T) {
|
|||||||
t.Errorf("got error %q, want nil", err)
|
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"
|
// The angle brackets "<" and ">" are escaped to "\u003c" and "\u003e"
|
||||||
// to keep some browsers from misinterpreting JSON output as HTML.
|
// to keep some browsers from misinterpreting JSON output as HTML.
|
||||||
//
|
//
|
||||||
// Array and slice values encode as JSON arrays, except that
|
// Array and slice values encode as JSON arrays, except that a slice of
|
||||||
// []byte encodes as a base64-encoded string, and a nil slice
|
// bytes encodes as a base64-encoded string, and a nil slice
|
||||||
// encodes as the null JSON object.
|
// encodes as the null JSON object.
|
||||||
//
|
//
|
||||||
// Struct values encode as JSON objects. Each exported struct field
|
// Struct values encode as JSON objects. Each exported struct field
|
||||||
|
Loading…
Reference in New Issue
Block a user