【问题标题】:Return empty list instead of null返回空列表而不是 null
【发布时间】:2019-03-08 13:00:13
【问题描述】:

我想更改我当前的函数以返回空 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)
}

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

【问题讨论】:

    标签: json go null slice


    【解决方案1】:

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

    数组和切片值编码为 JSON 数组,除了 []byte 编码为 base64 编码字符串,nil 切片编码为空 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{}
    }
    

    【讨论】:

      【解决方案2】:

      另一种处理方法是检查切片是否为 nil 并对其进行初始化:

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

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

      来源:Arrays and JSON in Go

      【讨论】:

        猜你喜欢
        • 2018-08-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-24
        • 2014-08-15
        • 1970-01-01
        • 2018-12-18
        • 1970-01-01
        相关资源
        最近更新 更多