1.我们可以写一个函数专门用来处理json
func getJsonParam(c *gin.Context) func(param string) (value string, err error) {
jsonData := map[string]interface{}{}
err := c.BindJSON(&jsonData)
return func(param string) (string, error) {
if err != nil {
return "", err
}
value, err := func() (value string, err error) {
i, exists := jsonData[param]
if !exists {
return "", errors.New("缺少" + param + "字段")
}
switch i.(type) {
case string:
return i.(string), nil
}
return "", errors.New(param + "的值不为字符串")
}()
if err != nil {
return "", err
}
return value, err
}
}
2.这个函数只适用与处理[string]:[string]类型的json数据,如果想处理任意格式的json,可以使用下面这个函数:
func getJsonAnyParam(c *gin.Context) func(param string) (interface{}, error) {
jsonData := map[string]interface{}{}
err := c.BindJSON(&jsonData)
return func(param string) (interface{}, error) {
if err != nil {
return nil, err
}
value, err := func() (interface{}, error) {
i, exists := jsonData[param]
if !exists {
return nil, errors.New("缺少" + param + "字段")
}
return i, nil
}()
if err != nil {
return nil, err
}
return value, err
}
}
使用方法
data := getJsonAnyParam(c)
username := data("username")
fmt.Println(username)
3.我们还可以使用结构体快速解析json
package main
type Person struct {
Name string `json:"name"`
Age int `json:"age"`
IsStudent bool `json:"is_student"`
}
func main(){
var p Person
c.ShouldBind(&p)
fmt.Println(p)
}
这种方法更方便,但是没有上面的通用性强。
4.如何向前端发送json
c.JSON(200, gin.H{
"key1":"value1",
"key2":"value2",
})
5.如何向前端发送一个复杂的json
package main
import "encoding/json"
type Person struct {
Name string `json:"name"`
Age byte `json:"age"`
}
type Student struct {
Person `json:"data"`
Course string `json:"course"`
}
func main() {
student := &Student{
Person: Person{
Name: "john",
Age: 20,
},
Course: "math",
}
data, err := json.Marshal(student)
if err != nil {
return
}
c.Data(200, "application/json", data)
}