返回空列表,而不是null

时间:2019-03-08 13:00:14

标签: json go null slice

我想更改当前函数以返回空的JSON列表,当前它返回nil

这是我当前的代码:

func (s *Service) projectsGet(c *gin.Context) {
    var projects []*models.Project

    user := getUser(c)
    pag := models.NewPagination(c)

    ps, err := s.db.ProjectsGet(user.ID, &pag)
    if err != nil {
        apiError(c, http.StatusInternalServerError, err)
        return
    }

    projects = ps
    c.JSON(http.StatusOK, projects)
}

我希望它返回[],我该怎么做?

2 个答案:

答案 0 :(得分:4)

一个nil切片编码为一个null JSON对象。记录在json.Marshal()

  

数组和切片值编码为JSON数组,除了[] byte编码为base64编码的字符串,而 nil slice编码为空JSON值

如果要使用非null空的JSON数组,请使用非nil空的Go切片。

请参见以下示例:

type Project struct {
    Name string `json:"name"`
}

enc := json.NewEncoder(os.Stdout)

var ps []*Project
enc.Encode(ps)

ps = []*Project{}
enc.Encode(ps)

输出(在Go Playground上尝试):

null
[]

因此,请确保您的projects不是nil,例如:

projects = ps
if projects == nil {
    projects = []*models.Project{}
}

答案 1 :(得分:0)

处理此问题的另一种方法是检查切片是否为nil并将其初始化:

projects = ps
if projects == nil {
    projects = make([]*models.Project, 0)
}

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

来源:Arrays and JSON in Go