关于gin:基于Gin框架的web后端开发二-JSON数据生成

42次阅读

共计 2082 个字符,预计需要花费 6 分钟才能阅读完成。

基于 Gin 框架的 web 开发,总的来讲有两种:

  • 第一种是后端应用 go 语言模板引擎实现整个 web 全栈开发,返回残缺的 html 文件给浏览器。
  • 第二种是前后端拆散,应用 JSON 交互

因为第一种办法消耗太多网络资源,性能差,耦合度高,目前曾经根本被第二种模式取代,这篇博客只介绍如何在 Gin 框架中返回 JSON 数据给前端或者挪动端(俗称 JSON 的渲染)。


生成 JSON 数据能够用 map,也能够用构造体。上面先介绍 map:

基于 map 的 JSON 数据生成

举个例子,代码如下:

package main

import (
    "github.com/gin-gonic/gin"
    "net/http"
)

func main() {r := gin.Default()
    r.GET("/json", func(c *gin.Context) {
        // 这里结构服务器要返回前端的数据,一共有两种办法,第一种是:应用 map 将数据序列化
        //, 这个 map 的 key 是一个 string,value 是一个空的接口(这样即能够实现接管任意类型的数据)data := map[string]interface{}{
            "name":    "liber",
            "message": "hey liber~",
            "age":     16,
        }
        // 这里要返回 json 格局的数据,所以用 c.JSON, 这样,数据就返回给申请方了
        c.JSON(http.StatusOK, data)
    })
    r.Run(":9090")
}

测试后果如下:

因为用 map 来序列化 json 数据是很常见的写法,Gin 框架的作者将这种写法封装了一下:

//H is a shortcut for map[string]interface{}
type H map[string]interface{}

所以,咱们能够间接应用 gin.H{} 来代替:

package main

import (
    "github.com/gin-gonic/gin"
    "net/http"
)

func main() {r := gin.Default()
    r.GET("/json", func(c *gin.Context) {
        // 这里结构服务器要返回前端的数据,一共有两种办法,第一种是:应用 map 将数据序列化
        //, 这个 map 的 key 是一个 string,value 是一个空的接口(这样即能够实现接管任意类型的数据)//data := map[string]interface{}{
        //    "name":    "liber",
        //    "message": "hey liber~",
        //    "age":     16,
        //}
        data := gin.H{
            "name":    "libro",
            "message": "hey libro~",
            "age":     17,
        }
        // 这里要返回 json 格局的数据,所以用 c.JSON, 这样,数据就返回给申请方了
        c.JSON(http.StatusOK, data)
    })
    r.Run(":9090")
}

测试后果如下:

基于构造体的 JSON 数据生成

其实就是另一种写法而已:

package main

import (
    "github.com/gin-gonic/gin"
    "net/http"
)

func main() {r := gin.Default()
    r.GET("/json", func(c *gin.Context) {
        // 这里结构服务器要返回前端的数据,一共有两种办法,第一种是:应用 map 将数据序列化
        //, 这个 map 的 key 是一个 string,value 是一个空的接口(这样即能够实现接管任意类型的数据)//data := map[string]interface{}{
        //    "name":    "liber",
        //    "message": "hey liber~",
        //    "age":     16,
        //}
        data := gin.H{
            "name":    "libro",
            "message": "hey libro~",
            "age":     17,
        }
        // 这里要返回 json 格局的数据,所以用 c.JSON, 这样,数据就返回给申请方了
        c.JSON(http.StatusOK, data)
    })

    // 这里介绍生成 JSON 数据的第二种办法:利用构造体
    // 首先结构一个构造体
    type msg struct {
        Name    string
        Message string
        Age     int
    }
    // 而后构建一个构造体的实例
    r.GET("/another_json", func(c *gin.Context) {
        data := msg{
            Name:    "libro",
            Message: "hey libro~",
            Age:     17,
        }
        c.JSON(http.StatusOK, data)
    })
    r.Run(":9090")
}

测试后果如图:

不过须要留神的是,如果应用构造体,字段结尾字母必须大写,否则就没方法实现 JSON 的序列化,因为 JSON 序列化过程中应用到了 Go 内置的反射机制,小写示意不可导出。当然这也有解决之道,就是打 tag:

// 这里假如 前端就须要小写的 name
    type msg struct {
        Name    string `json: "name"`
        Message string
        Age     int
    }

其实我感觉,既然有坑,间接规定用第一种办法躲避掉是一种简洁 & 理智的抉择。


参考: bilibili

正文完
 0