如何在Go json marshal中显示空对象而不是空结构或nil

时间:2018-05-02 14:03:47

标签: json go marshalling

对于结构指针执行{}时,我需要显示json的空对象json.Marshal()。我只能输出null值或空结构值。

如果person密钥填充了&Person{}new(Person),则会显示如下所示的空结构:

{
    "data": {
        "person": {
            "name": "",
            "age": 0
        },
        "created_date": "2009-11-10T23:00:00Z"
    }
}

如果我们根本不对其进行初始化,则会显示null

{
    "data": {
        "person": null,
        "created_date": "2009-11-10T23:00:00Z"
    }
}

我想展示"person": {}。有可能吗?

去Playground获取完整代码:https://play.golang.org/p/tT15G2ESPVc

2 个答案:

答案 0 :(得分:4)

选项 A ,在所有omitempty字段上使用Person标记选项,并确保在编组之前分配响应字段。

type Person struct {
    Name string `json:"name,omitempty"`
    Age  int    `json:"age,omitempty"`
}

// ...

resp.Person = new(Person)

https://play.golang.org/p/o3jWdru_8bC

选项 B ,使用嵌入Person指针类型的非指针包装类型。

type PersonJSON struct {
    *Person
}

type Response struct {
    Person      PersonJSON `json:"person"`
    CreatedDate time.Time   `json:"created_date"`
}

https://play.golang.org/p/EKQc7uf1_Vk

选项 C ,让Reponse类型实现json.Marshaler界面。

func (r *Response) MarshalJSON() ([]byte, error) {
    type tmp Response
    resp := (*tmp)(r)

    var data struct {
        Wrapper struct {
            *Person
        } `json:"person"`
        *tmp
    }
    data.Wrapper.Person = resp.Person
    data.tmp = resp
    return json.Marshal(data)
}

https://play.golang.org/p/1qkSCWZ225j

可能还有其他选择......

答案 1 :(得分:0)

在Go中,根据定义,空结构为字段元素分配零值。例如:对于int 0,""用于字符串等

对于您的情况,只需比较null就可以了。或者,您可以将emptyPerson定义为:

 var BAD_AGE = -1
 emptyPerson := &Person{"", BAD_AGE} // BAD_AGE indicates no person
 if person[age] == BAD_AGE {
    // handle case for emptyPerson}