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

tam*_*ama 4 json marshalling go

我需要显示JSON的空对象{}时,做json.Marshal()了一个结构指针。我只能输出nullvalue或空的struct值。

如果person键用&Person{}或填充new(Person),它将显示空结构,如下所示:

{
    "data": {
        "person": {
            "name": "",
            "age": 0
        },
        "created_date": "2009-11-10T23:00:00Z"
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我们根本不初始化它,它将显示null

{
    "data": {
        "person": null,
        "created_date": "2009-11-10T23:00:00Z"
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

mko*_*iva 5

选项Aomitempty在所有Person的字段上使用标签选项,并确保在封送处理之前已分配响应的字段。

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

// ...

resp.Person = new(Person)
Run Code Online (Sandbox Code Playgroud)

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"`
}
Run Code Online (Sandbox Code Playgroud)

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)
}
Run Code Online (Sandbox Code Playgroud)

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


可能还有其他选择...