mirror of
https://github.com/golang/go
synced 2024-11-21 16:34:42 -07:00
json: Properly handle nil slices.
Marshal nil slices as null and parse null value as a nil slice. Fixes #2278. R=rsc CC=golang-dev https://golang.org/cl/5257053
This commit is contained in:
parent
288dacd016
commit
48c75c5f9c
@ -588,7 +588,7 @@ func (d *decodeState) literalStore(item []byte, v reflect.Value) {
|
||||
switch v.Kind() {
|
||||
default:
|
||||
d.saveError(&UnmarshalTypeError{"null", v.Type()})
|
||||
case reflect.Interface, reflect.Ptr, reflect.Map:
|
||||
case reflect.Interface, reflect.Ptr, reflect.Map, reflect.Slice:
|
||||
v.Set(reflect.Zero(v.Type()))
|
||||
}
|
||||
|
||||
|
@ -456,7 +456,7 @@ var allValueIndent = `{
|
||||
"PSlice": null,
|
||||
"PSliceP": null,
|
||||
"EmptySlice": [],
|
||||
"NilSlice": [],
|
||||
"NilSlice": null,
|
||||
"StringSlice": [
|
||||
"str24",
|
||||
"str25",
|
||||
@ -528,8 +528,8 @@ var pallValueIndent = `{
|
||||
},
|
||||
"EmptyMap": null,
|
||||
"NilMap": null,
|
||||
"Slice": [],
|
||||
"SliceP": [],
|
||||
"Slice": null,
|
||||
"SliceP": null,
|
||||
"PSlice": [
|
||||
{
|
||||
"Tag": "tag20"
|
||||
@ -547,10 +547,10 @@ var pallValueIndent = `{
|
||||
"Tag": "tag23"
|
||||
}
|
||||
],
|
||||
"EmptySlice": [],
|
||||
"NilSlice": [],
|
||||
"StringSlice": [],
|
||||
"ByteSlice": "",
|
||||
"EmptySlice": null,
|
||||
"NilSlice": null,
|
||||
"StringSlice": null,
|
||||
"ByteSlice": null,
|
||||
"Small": {
|
||||
"Tag": ""
|
||||
},
|
||||
|
@ -352,7 +352,15 @@ func (e *encodeState) reflectValueQuoted(v reflect.Value, quoted bool) {
|
||||
}
|
||||
e.WriteByte('}')
|
||||
|
||||
case reflect.Array, reflect.Slice:
|
||||
case reflect.Slice:
|
||||
if v.IsNil() {
|
||||
e.WriteString("null")
|
||||
break
|
||||
}
|
||||
// Slices can be marshalled as nil, but otherwise are handled
|
||||
// as arrays.
|
||||
fallthrough
|
||||
case reflect.Array:
|
||||
if v.Type() == byteSliceType {
|
||||
e.WriteByte('"')
|
||||
s := v.Interface().([]byte)
|
||||
|
@ -28,7 +28,7 @@ type Optionals struct {
|
||||
var optionalsExpected = `{
|
||||
"sr": "",
|
||||
"omitempty": 0,
|
||||
"slr": [],
|
||||
"slr": null,
|
||||
"mr": {}
|
||||
}`
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user