Golang - 从JSON Response隐藏空结构

时间:2014-09-02 17:04:08

标签: json google-app-engine struct go

如果其中任何一个为空,我试图让ErrorSuccess结构消失

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 个答案:

答案 0 :(得分:2)

这是因为appReturn.SucappReturn.Err不为空;它们包含指向初始化结构的指针,它恰好在内部有nil指针。唯一的空指针是nil指针。

将appReturn初始化为j := appReturn{}

答案 1 :(得分: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
    }
}