使用Golang和Gin返回JSON时,应该返回一个空数组而不是null。

37

所以我有一个结构体:

type ProductConstructed struct {
    Name string `json:"Name"`
    BrandMedals []string `json:"BRAND_MEDALS"`
}

当我使用Gin和冒号返回我的对象时:

func  contructproduct(c *gin.Context) {
    var response ProductConstructed 
    response.Name = "toto"

    c.JSON(200, response)
}

func main() {
    var err error
    if err != nil {
        panic(err)
    }
    //gin.SetMode(gin.ReleaseMode)
    r := gin.Default()
    r.POST("/constructProductGo/v1/constructProduct", contructproduct)
    r.Run(":8200") // listen and serve on 0.0.0.0:8080
}

它返回给我:

null

而不是

[]

如何返回一个空数组?

问候


你正在使用结构体作为响应,而不是结构体数组,因此当前输出是准确的。从你的代码中看来,你只想一次返回一个结构体。所以,不要通过空数组来处理它,而是在 null 上进行处理。 - Manish Champaneri
2个回答

57
所以解决方案是用以下方式进行初始化:
productConstructed.BrandMedals = make([]string, 0)

19
或者 productConstructed.BrandMedals = []string{} 也可以。 - Seaskyways
@Seaskyways,你的解决方案更加优雅和易读,谢谢。 - Bussiere
它完全等效,只是语法不同。 - Seaskyways

21

仅为了澄清为什么上述解决方案有效:

slice1已声明但未定义。尚未分配变量给它,因此它等于nil。序列化时,它将返回null

slice2已声明并定义。它等于一个空切片,而不是nil。序列化时,它将返回[]

var slice1 []string  // nil slice value
slice2 := []string{} // non-nil but zero-length

json1, _ := json.Marshal(slice1)
json2, _ := json.Marshal(slice2)

fmt.Printf("%s\n", json1) // null
fmt.Printf("%s\n", json2) // []

fmt.Println(slice1 == nil) // true
fmt.Println(slice2 == nil) // false

Go Playground: https://play.golang.org/p/m9YEQYpJLdj

更多信息:https://github.com/golang/go/wiki/CodeReviewComments#declaring-empty-slices


这是一个简单明了的答案。我使用了 if len(records) == 0 { return []record{} } - orpheus
这是不正确的行为,因为Go对所有非指针变量使用默认值。 - Andrey Nikishaev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接