diff options
author | Ross Light <rlight2@gmail.com> | 2009-12-09 10:36:03 -0800 |
---|---|---|
committer | Ross Light <rlight2@gmail.com> | 2009-12-09 10:36:03 -0800 |
commit | 0b385d6c286fbd2aa9ea131a42281a82e08a1331 (patch) | |
tree | 27c1e6d09bd1f5fdf63e5ecdb8dc6d2502fd66d0 | |
parent | 0df82cfcfd30fe4aab963ae1eb926e494807253e (diff) | |
download | golang-0b385d6c286fbd2aa9ea131a42281a82e08a1331.tar.gz |
json package: Fixed handling of nil values
Fixes issue 400.
R=golang-dev, rsc
http://codereview.appspot.com/167058
Committer: Russ Cox <rsc@golang.org>
-rw-r--r-- | src/pkg/json/struct.go | 12 | ||||
-rw-r--r-- | src/pkg/json/struct_test.go | 4 |
2 files changed, 15 insertions, 1 deletions
diff --git a/src/pkg/json/struct.go b/src/pkg/json/struct.go index 8d8663193..d34939cbd 100644 --- a/src/pkg/json/struct.go +++ b/src/pkg/json/struct.go @@ -377,6 +377,11 @@ func writeStruct(w io.Writer, val *reflect.StructValue) os.Error { } func writeValue(w io.Writer, val reflect.Value) (err os.Error) { + if val == nil { + fmt.Fprint(w, "null"); + return; + } + switch v := val.(type) { case *reflect.StringValue: fmt.Fprintf(w, "%q", v.Get()) @@ -389,10 +394,15 @@ func writeValue(w io.Writer, val reflect.Value) (err os.Error) { case *reflect.StructValue: err = writeStruct(w, v) case *reflect.ChanValue, - *reflect.InterfaceValue, *reflect.PtrValue, *reflect.UnsafePointerValue: err = &MarshalError{val.Type()} + case *reflect.InterfaceValue: + if v.IsNil() { + fmt.Fprint(w, "null") + } else { + err = &MarshalError{val.Type()} + } default: value := val.(reflect.Value); fmt.Fprint(w, value.Interface()); diff --git a/src/pkg/json/struct_test.go b/src/pkg/json/struct_test.go index c01f4ddeb..0c7976eba 100644 --- a/src/pkg/json/struct_test.go +++ b/src/pkg/json/struct_test.go @@ -177,6 +177,7 @@ type marshalTest struct { var marshalTests = []marshalTest{ // basic string + marshalTest{nil, "null"}, marshalTest{true, "true"}, marshalTest{false, "false"}, marshalTest{123, "123"}, @@ -185,11 +186,14 @@ var marshalTests = []marshalTest{ marshalTest{"teststring", `"teststring"`}, marshalTest{[4]int{1, 2, 3, 4}, "[1,2,3,4]"}, marshalTest{[]int{1, 2, 3, 4}, "[1,2,3,4]"}, + marshalTest{[]interface{}{nil}, "[null]"}, marshalTest{[][]int{[]int{1, 2}, []int{3, 4}}, "[[1,2],[3,4]]"}, marshalTest{map[string]string{"one": "one"}, `{"one":"one"}`}, marshalTest{map[string]int{"one": 1}, `{"one":1}`}, + marshalTest{map[string]interface{}{"null": nil}, `{"null":null}`}, marshalTest{struct{}{}, "{}"}, marshalTest{struct{ a int }{1}, `{"a":1}`}, + marshalTest{struct{ a interface{} }{nil}, `{"a":null}`}, marshalTest{struct { a int; b string; |