我有一个强制转换为结构的查询。但是当查询没有返回结果时,响应为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})
答案 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)
}
如果您有多个结构以及带有数组的结构,这可能很乏味。要处理这些问题,您可以创建自定义封送员或动态检查字段。