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

I need to show json's empty object {} when do json.Marshal() for a struct pointer. I can only output either null value or empty struct value.

If the person key is filled with &Person{} or new(Person), it will show empty struct like below:

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

And if we don't initialize it at all, it will show null.

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

I want to show "person": {}. Is it possible?

Go Playground for the complete code: https://play.golang.org/p/tT15G2ESPVc

dozya46004
dozya46004 感谢所有的答案。我决定使用您的第二种选择。它很容易实现。您可以发布对这个问题的答案,以便我接受。
2 年多之前 回复
doudi8298
doudi8298 这个有点难看,但是可以在不影响您原始结构的情况下工作。play.golang.org/p/1qkSCWZ225j
2 年多之前 回复
doushi4864
doushi4864 您可以在第二个注释中使用替代方法,或者必须在Response类型上实现Marshaler接口,我认为几乎所有选项都可以使用。
2 年多之前 回复
duan0514324
duan0514324 迄今为止,最简单的方法是在“人”的字段中使用无节制。但是当我想继续显示时,这会影响我的“人”的字段编码,例如,在元组结果为空时显示“Person.name”
2 年多之前 回复
duannuochi3549
duannuochi3549 处理此问题的另一种方法是使用嵌入您的Person指针类型的非指针包装器类型,例如:play.golang.org/p/EKQc7uf1_Vk
2 年多之前 回复
douquan1015
douquan1015 在“人员”的字段中使用省略号。play.golang.org/p/o3jWdru_8bC
2 年多之前 回复

2个回答



选项 A </ strong>,在所有上使用 omitempty </ code>标记选项 >人员</ code>的字段,并确保在封送之前已分配响应的字段。</ p>

  type Person struct {
Name stringjson:“ name,omitempty”
Age intjson:“ age,omitempty”
}

// ...

resp.Person = new(Person)
</ code> </ pre>
\ n

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


选项 B </ strong>,使用嵌入 Person </ code>的非指针</ em>包装类型 指针类型。</ p>

  type PersonJSON结构{

  • Person }

type响应结构{
Person PersonJSONjson:“ person”
CreatedDate时间 .Timejson:“ created_date”
}
</ code> </ pre>

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


选择 ion C </ strong>,具有 Response </ code>类型实现 json.Marshaler </ code>接口。</ p>

  func  (r 响应)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
    返回json.Marshal(data)
    }
    < / code> </ pre>

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


    可能还有其他选项... </ p>
    </ div>

展开原文

原文

Option A, use the omitempty tag option on all of the Person's fields and make sure the response's field is allocated before marshaling.

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

// ...

resp.Person = new(Person)

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


Option B, use a non-pointer wrapper type that embeds the Person pointer type.

type PersonJSON struct {
    *Person
}

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

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


Option C, have the Reponse type implement the json.Marshaler interface.

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


There may be other options...

In Go, an empty struct by definition assigns zero values to field elements. Eg: for int 0, "" for string, etc.

For your case, simply comparing to null would work out. Or, you could define an emptyPerson as:

 var BAD_AGE = -1
 emptyPerson := &Person{"", BAD_AGE} // BAD_AGE indicates no person
 if person[age] == BAD_AGE {
    // handle case for emptyPerson}
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐