废话不多说,排版不多管了,直接把问题拿出来!又卡我几个小时
我定义了结构体数组,将数据库中的用户数据拿出来存储进去,然后按照总分顺序排名成功!好了,我开始返回JSON形式了:
但不幸的事情是:前端需要的是数组形式!!!,并且如上方法直接返回的话,返回结果按照字典序排列,不能保持上述键值对的顺序!!!看下图!顺序是字典序排列!
那么——我们返回一两个参数还可以用gin.H{ }来解决,参数一多,再加上有序性,就得换一种方法来返回JSON数组了! 下面的代码是通常可以用到的:
//这种通常用gin.H
c.JSON(http.StatusOK, gin.H{
"code": 200
"msg": succeed_login
})
我们要返回JSON有序数组,OK,那就直接给切片(大小刚合适),但是!我们因为前期需要排序呀,所以定义的数组方便运算,而数组大小又是开很大的呢,所以我们在返回JSON前转回切片!
用到的方法如下:
type Rank struct {
//用到json记得一定大写首字母
UserId string `json:"userId"`
Solved_problem_number string `json:"solved_problem_number"`
Solved_problem_score string `json:"solved_problem_score"`
}
s := make([]Rank, 0)
for i := 0; i < cnt; i++{
s = append(s, rank[i])
}
fmt.Println(s)
c.JSON(http.StatusOK, gin.H{
"rank": s,
})
于是,我们便得到了JSON字符串的返回形式!
交互结果如下:
总结
- 为什么不用gin.H呢?因为虽然保持了键值对,但是!未能返回数组,顺序也是map的无序性!
- 为什么不一开始就用切片呢?因为前期需要用到结构体数组排序操作
- 为什么最后需要转切片呢?因为切片大小是合理的!可以适应大小返回数据给前端
- 在结构体的声明中用到 json:“xxx” 的时候,前面的变量名一定**大写!!!**后面的json就是我们返回数组是前面对应的键!
- 返回JSON数组和JSON对象是不一样的!
- 既然是返回数组形式即
{ [ { },{ },{ },{ } ], xxx }
,那么不能如第一幅图中那样一项一项返回数组中的项!不然就是大括号接大括号,没有逗号分离,这种连续的JSON返回前端并不容易处理