dslfq06464 2014-09-02 17:04 采纳率: 0%
浏览 87
已采纳

Golang-从JSON响应中隐藏空结构

I'm trying to make the Error and Success struct disappear if either one of them is empty

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)
}

Output:

{
    success: { },
    error: { }
}

How can I hide the Error or Success struct from the JSON output? I thought that sending the pointer as an argument would do the trick.

  • 写回答

2条回答 默认 最新

  • dongmou5628 2014-09-02 17:32
    关注

    You can pass in nil for either argument to make it disappear:

    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))
    

    If for whatever reason you can't do that, you could also write a custom JSON marshaler to check for the empty struct:

    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
        }
    } 
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 使用EMD去噪处理RML2016数据集时候的原理
  • ¥15 神经网络预测均方误差很小 但是图像上看着差别太大
  • ¥15 Oracle中如何从clob类型截取特定字符串后面的字符
  • ¥15 想通过pywinauto自动电机应用程序按钮,但是找不到应用程序按钮信息
  • ¥15 如何在炒股软件中,爬到我想看的日k线
  • ¥15 seatunnel 怎么配置Elasticsearch
  • ¥15 PSCAD安装问题 ERROR: Visual Studio 2013, 2015, 2017 or 2019 is not found in the system.
  • ¥15 (标签-MATLAB|关键词-多址)
  • ¥15 关于#MATLAB#的问题,如何解决?(相关搜索:信噪比,系统容量)
  • ¥500 52810做蓝牙接受端