响应时的空结构

时间:2016-08-04 14:42:09

标签: arrays json go struct slice

我有一个强制转换为结构的查询。但是当查询没有返回结果时,响应为null - 如何将其作为空数组[]

_, err := dbmap.Select(&response.DevTeam, "SELECT * FROM DevTeam WHERE app_id = ? LIMIT ? OFFSET ?", a_id, limit, offset)

没有结果时的回复:

{
  "data": null,
  "meta": "success"
}

没有结果时所需的响应:

{
  "data": [],
  "meta": "success"
}

仍然为空 - 我的结构设置是:

type HttpResonse struct {
    DevTeam []DevTeam `json:"data"`
}

我正在使用response.DevTeam = []models.DevTeam{},如下所示,但仍然获得null

回应部分:

s.Count = int64(len(response.DevTeam))  
c.JSON(httpcode, gin.H{"meta": s, "data": response.DevTeam})

2 个答案:

答案 0 :(得分:1)

切片类型为nil的值编码为null JSON对象。非nil空切片被封送到空数组[]

在编组response之前,请检查DevTeam字段,如果是nil,则明确设置长度为0的切片值,例如:

if response.DevTeam == nil {
   response.DevTeam = []models.DevTeam{} 
}

或者,当您创建gin.H包装时,如果后者等于response.DevTeam,请使用空切片而不是nil

见这个简单的例子:

type Pt struct {
    DevTeam []string
}

p := Pt{}
json.NewEncoder(os.Stdout).Encode(p)

p.DevTeam = []string{}
json.NewEncoder(os.Stdout).Encode(p)

输出(在 Go Playground 上试试):

{"DevTeam":null}
{"DevTeam":[]}

答案 1 :(得分:-1)

要将nil slice编码为空JSON数组,您需要使用make()将其初始化为空片:

if response.DevTeam == nil {
   response.DevTeam = make([]models.DevTeam, 0)
}

如果您有多个结构以及带有数组的结构,这可能很乏味。要处理这些问题,您可以创建自定义封送员或动态检查字段。

来源:Arrays and JSON in Go