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

报告相同问题?

悬赏问题

  • ¥30 帮我写一段可以读取LD2450数据并计算距离的Arduino代码
  • ¥15 C#调用python代码(python带有库)
  • ¥15 矩阵加法的规则是两个矩阵中对应位置的数的绝对值进行加和
  • ¥15 活动选择题。最多可以参加几个项目?
  • ¥15 飞机曲面部件如机翼,壁板等具体的孔位模型
  • ¥15 vs2019中数据导出问题
  • ¥20 云服务Linux系统TCP-MSS值修改?
  • ¥20 关于#单片机#的问题:项目:使用模拟iic与ov2640通讯环境:F407问题:读取的ID号总是0xff,自己调了调发现在读从机数据时,SDA线上并未有信号变化(语言-c语言)
  • ¥20 怎么在stm32门禁成品上增加查询记录功能
  • ¥15 Source insight编写代码后使用CCS5.2版本import之后,代码跳到注释行里面