]> Cypherpunks repositories - gostls13.git/commitdiff
Propagate error to the caller in json.Marshal. Fixes issue 445.
authorIvan Krasin <krasin@golang.org>
Wed, 6 Jan 2010 15:25:17 +0000 (07:25 -0800)
committerRuss Cox <rsc@golang.org>
Wed, 6 Jan 2010 15:25:17 +0000 (07:25 -0800)
R=rsc, imkrasin
CC=golang-dev
https://golang.org/cl/179125

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

index 7b50301e4fc735c7cc4fb1cd7159055b187a4350..955ec7c875524ca06f01a5a222c2253781e7362a 100644 (file)
@@ -366,11 +366,9 @@ func writeStruct(w io.Writer, val *reflect.StructValue) os.Error {
        for i := 0; i < val.NumField(); i++ {
                fieldValue := val.Field(i)
                fmt.Fprintf(w, "%q:", typ.Field(i).Name)
-
                if err := writeValue(w, fieldValue); err != nil {
                        return err
                }
-
                if i < val.NumField()-1 {
                        fmt.Fprint(w, ",")
                }
@@ -398,14 +396,19 @@ func writeValue(w io.Writer, val reflect.Value) (err os.Error) {
        case *reflect.StructValue:
                err = writeStruct(w, v)
        case *reflect.ChanValue,
-               *reflect.PtrValue,
                *reflect.UnsafePointerValue:
                err = &MarshalError{val.Type()}
        case *reflect.InterfaceValue:
                if v.IsNil() {
                        fmt.Fprint(w, "null")
                } else {
-                       err = &MarshalError{val.Type()}
+                       err = writeValue(w, v.Elem())
+               }
+       case *reflect.PtrValue:
+               if v.IsNil() {
+                       fmt.Fprint(w, "null")
+               } else {
+                       err = writeValue(w, v.Elem())
                }
        default:
                value := val.(reflect.Value)
index 9a928f7d0bcd16610c6c95c60078ca190b966e5e..f1440c4139b20bb01e9c2aa5f01c8f00c7d60961 100644 (file)
@@ -175,6 +175,12 @@ type marshalTest struct {
        out string
 }
 
+type MTE string
+
+type OneField struct {
+       a int
+}
+
 var marshalTests = []marshalTest{
        // basic string
        marshalTest{nil, "null"},
@@ -201,6 +207,9 @@ var marshalTests = []marshalTest{
                `{"a":1,"b":"hello"}`,
        },
        marshalTest{map[string][]int{"3": []int{1, 2, 3}}, `{"3":[1,2,3]}`},
+       marshalTest{map[string]*MTE{"hi": nil}, `{"hi":null}`},
+       marshalTest{map[string]interface{}{"hi": 3}, `{"hi":3}`},
+       marshalTest{&OneField{3}, `{"a":3}`},
 }
 
 func TestMarshal(t *testing.T) {
@@ -224,11 +233,14 @@ type marshalErrorTest struct {
        error string
 }
 
-type MTE string
+type ChanVal struct {
+       C chan int
+}
 
 var marshalErrorTests = []marshalErrorTest{
        marshalErrorTest{map[chan int]string{make(chan int): "one"}, "json cannot encode value of type map[chan int] string"},
-       marshalErrorTest{map[string]*MTE{"hi": nil}, "json cannot encode value of type *json.MTE"},
+       marshalErrorTest{make(chan int, 100), "json cannot encode value of type chan int"},
+       marshalErrorTest{new(ChanVal), "json cannot encode value of type chan int"},
 }
 
 func TestMarshalError(t *testing.T) {