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 乌班图ip地址配置及远程SSH
  • ¥15 怎么让点阵屏显示静态爱心,用keiluVision5写出让点阵屏显示静态爱心的代码,越快越好
  • ¥15 PSPICE制作一个加法器
  • ¥15 javaweb项目无法正常跳转
  • ¥15 VMBox虚拟机无法访问
  • ¥15 skd显示找不到头文件
  • ¥15 机器视觉中图片中长度与真实长度的关系
  • ¥15 fastreport table 怎么只让每页的最下面和最顶部有横线
  • ¥15 java 的protected权限 ,问题在注释里
  • ¥15 这个是哪里有问题啊?