]> Cypherpunks repositories - gostls13.git/commitdiff
encoding/json: make ,string work when encoding pointer fields
authorBrad Fitzpatrick <bradfitz@golang.org>
Mon, 25 Aug 2014 17:32:46 +0000 (10:32 -0700)
committerBrad Fitzpatrick <bradfitz@golang.org>
Mon, 25 Aug 2014 17:32:46 +0000 (10:32 -0700)
It was respected by unmarshal, but not marshal, so they didn't
round-trip.

Fixes #8582

LGTM=rsc
R=rsc
CC=golang-codereviews
https://golang.org/cl/132960043

src/pkg/encoding/json/encode.go
src/pkg/encoding/json/encode_test.go

index 5341a3a01b753d66a9f306700ac9e88f614bf664..b63538c92254f64cc23c87be589627f7aa5161e2 100644 (file)
@@ -696,12 +696,12 @@ type ptrEncoder struct {
        elemEnc encoderFunc
 }
 
-func (pe *ptrEncoder) encode(e *encodeState, v reflect.Value, _ bool) {
+func (pe *ptrEncoder) encode(e *encodeState, v reflect.Value, quoted bool) {
        if v.IsNil() {
                e.WriteString("null")
                return
        }
-       pe.elemEnc(e, v.Elem(), false)
+       pe.elemEnc(e, v.Elem(), quoted)
 }
 
 func newPtrEncoder(t reflect.Type) encoderFunc {
index 2e89a78eb9fd01d75631f1b9a7cc1e6002e38009..eb84cbae14ca79580ed9a7dfac80ab21e9ea3d61 100644 (file)
@@ -452,3 +452,29 @@ func TestHTMLEscape(t *testing.T) {
                t.Errorf("HTMLEscape(&b, []byte(m)) = %s; want %s", b.Bytes(), want.Bytes())
        }
 }
+
+// golang.org/issue/8582
+func TestEncodePointerString(t *testing.T) {
+       type stringPointer struct {
+               N *int64 `json:"n,string"`
+       }
+       var n int64 = 42
+       b, err := Marshal(stringPointer{N: &n})
+       if err != nil {
+               t.Fatalf("Marshal: %v", err)
+       }
+       if got, want := string(b), `{"n":"42"}`; got != want {
+               t.Errorf("Marshal = %s, want %s", got, want)
+       }
+       var back stringPointer
+       err = Unmarshal(b, &back)
+       if err != nil {
+               t.Fatalf("Unmarshal: %v", err)
+       }
+       if back.N == nil {
+               t.Fatalf("Unmarshalled nil N field")
+       }
+       if *back.N != 42 {
+               t.Fatalf("*N = %d; want 42", *back.N)
+       }
+}