]> Cypherpunks repositories - gostls13.git/commitdiff
json package: Fixed handling of nil values
authorRoss Light <rlight2@gmail.com>
Wed, 9 Dec 2009 18:36:03 +0000 (10:36 -0800)
committerRuss Cox <rsc@golang.org>
Wed, 9 Dec 2009 18:36:03 +0000 (10:36 -0800)
Fixes #400.

R=golang-dev, rsc
https://golang.org/cl/167058

src/pkg/json/struct.go
src/pkg/json/struct_test.go

index 8d866319390d7ddc158bc962fed2ea688de640fd..d34939cbd27b61fb8cd1d3ece7e3fff2315e0758 100644 (file)
@@ -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());
index c01f4ddeb980b6475d272dc5ef8e094d8399d193..0c7976eba0e1d462ba82837c104cdc735893d0cb 100644 (file)
@@ -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;