2014-09-02 48 views
0

我試圖讓ErrorSuccess結構消失,如果他們中的任何一個爲空Golang - 從JSON響應隱藏空結構

package main 

import (
    "encoding/json" 
    "net/http" 
) 

type appReturn struct { 
    Suc *Success `json:"success,omitempty"` 
    Err *Error `json:"error,omitempty"` 
} 

type Error struct { 
    Code int `json:"code,omitempty"` 
    Message string `json:"message,omitempty"` 
} 

type Success struct { 
    Code int `json:"code,omitempty"` 
    Message string `json:"message,omitempty"` 
} 

func init() { 
    http.HandleFunc("/", handler) 
} 

func handler(w http.ResponseWriter, r *http.Request) { 
    j := appReturn{&Success{}, &Error{}} 

    js, _ := json.Marshal(&j) 
    w.Header().Set("Content-Type", "application/json") 
    w.Write(js) 
} 

輸出:

{ 
    success: { }, 
    error: { } 
} 

我怎麼能隱藏來自JSON輸出的ErrorSuccess結構? 我認爲發送指針作爲參數會做的伎倆。

回答

2

可以在nil通過對任一參數,使之消失:

http://play.golang.org/p/9Say6mVzCg

j := appReturn{&Success{}, nil} 
js, _ := json.Marshal(&j) 
fmt.Println(string(js)) 
j = appReturn{nil, &Error{}} 
js, _ = json.Marshal(&j) 
fmt.Println(string(js)) 
j = appReturn{nil, nil} 
js, _ = json.Marshal(&j) 
fmt.Println(string(js)) 

如果因任何原因,你不能做到這一點,你可以還要編寫自定義JSON封送拆收器以檢查空結構:

http://play.golang.org/p/W0UhB4qtXH

func (j appReturn) MarshalJSON() ([]byte, error) { 
    suc, _ := json.Marshal(j.Suc) 
    err, _ := json.Marshal(j.Err) 
    if (string(err) == "{}") { 
     return []byte("{\"success\":" + string(suc) + "}"), nil 
    } else { 
     return []byte("{\"error\":" + string(err) + "}"), nil 
    } 
} 
2

這是因爲appReturn.SucappReturn.Err不爲空;它們包含指向的初始化結構,它們恰好在裏面有零個指針。唯一的空指針是一個零指針。

初始化appReturn作爲j := appReturn{}