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:
Alexander Reece 2011-10-31 13:59:23 -04:00 committed by Russ Cox
parent 288dacd016
commit 48c75c5f9c
4 changed files with 18 additions and 10 deletions

View file

@ -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()))
}

View file

@ -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": ""
},

View file

@ -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)

View file

@ -28,7 +28,7 @@ type Optionals struct {
var optionalsExpected = `{
"sr": "",
"omitempty": 0,
"slr": [],
"slr": null,
"mr": {}
}`