【问题标题】:Golang - Hiding empty struct from JSON ResponseGolang - 从 JSON 响应中隐藏空结构
【发布时间】:2014-09-02 17:04:07
【问题描述】:

如果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 结构? 我认为将指针作为参数发送就可以了。

【问题讨论】:

    标签: json google-app-engine struct go


    【解决方案1】:

    您可以为任一参数传入 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 不为空;它们包含指向已初始化结构的指针,而这些结构恰好内部有 nil 指针。唯一的空指针是 nil 指针。

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

      【讨论】:

        猜你喜欢
        • 2013-06-22
        • 2018-05-23
        • 2013-11-11
        • 1970-01-01
        • 1970-01-01
        • 2018-06-13
        • 2019-11-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多