Golang Gin 实战Ⅷ | JSON渲染输出

631 阅读3分钟

Gin对于API JSON的支持非常友好,可以让我们非常方便的开发一个基于JSON的API。

JSON渲染 快速入门

func main() {
    r := gin.Default()
    r.GET("/hello", func(c *gin.Context) {
        c.JSON(200, gin.H{"message": "hello world"})
    })
    r.Run(":8080")
}

一个非常简单的例子,主要知识点在于c.JSON方法,它可以让我们非常方便的输出JSON格式的内容。

现在运行打开浏览器访问http://localhost:8080/hello可以看到如下内容:

{"message":"hello world"}

这是一个JSON格式的字符串,第三方调用者可以获得这个JSON内容,把它转换为一个JSON对象,然后通过message字段获取对应的值,也就是hello world

这里我们使用了gin.H这个类型来构建了一个键值对对象,其实gin.H是一个map[string]interface{}

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

gin.H主要是为了帮助我们开发者很方便的构建出一个map对象,不止用于c.JSON方法,也可以用于其他场景。

Struct 转 JSON

c.JSON方法非常强大,不止可以用于map的输出,还可以把我们自定义的对象struct转为一个json字符串输出。

func main() {
    r := gin.Default()
    r.GET("/users/123", func(c *gin.Context) {
        c.JSON(200, user{ID: 123, Name: "张三", Age: 20})
    })
    r.Run(":8080")
}

type user struct {
    ID   int
    Name string
    Age  int
}

这个例子中我们自定义了一个user struct 来表示用户,然后我们注册一个用户ID为123的路由,用于输出这个用户的信息,这里使用的就是user struct,把它作为参数直接传给c.JSON方法即可。

现在我们运行,在浏览器里访问http://localhost:8080/users/123 可以看到如下信息:

{"ID":123,"Name":"张三","Age":20}

简单的把这个用户的信息作为一个JSON字符串输出,大功告成。

自定义JSON字段名称

看上面的例子,我们发现输出的JSON字符串的字段和我们定义的user的字段名一样,但是这样的命名格式显然不太适合JSON,因为JSON的字段应该是小写字母开头的,这比较符合当前大家所遵守的JSON风格。

Gin是支持字段名字重新命名的,并且很简单,和Golang原生的JSON一样。

type user struct {
    ID   int    `json:"id"`
    Name string `json:"name"`
    Age  int    `json:"age"`
}

只需要在user struct 定义的时候为字段添加json tag即可。 现在我们重新运行,在浏览器里访问http://localhost:8080/users/123 ,发现看到的信息已经变了:
{"id":123,"name":"张三","age":20} 更符合JSON的风格了,看着更顺眼一些。

JSON数组

在一些情况下,比如我们需要获取所有用户信息,那么表达为JSON字符串来说,就是一个JSON数组。在Gin中,生成JSON数组也很简单,只要我们传递给c.JSON的参数是个数组就可以。 allUsers := []user{{ID: 123, Name: "张三", Age: 20}, {ID: 456, Name: "李四", Age: 25}} r.GET("/users", func(c *gin.Context) { c.IndentedJSON(200, allUsers) }) 我们首先定义了一个user数组,然后使用c.IndentedJSON输出JSON字符串,现在运行打开浏览器,访问http://localhost:8080/users就可以看到如下信息,一个JSON数组字符串: [ { "id": 123, "name": "张三", "age": 20 }, { "id": 456, "name": "李四", "age": 25 } ]

IndentedJSON 美化

上面的例子,我们可以看到,输出的JSON字符串都是扁平的,没有缩进,不美观。对于这种情况,Gin也为我们提供了便捷的方法,让我们输出的JSON更好看。 r.GET("/users/456", func(c *gin.Context) { c.IndentedJSON(200, user{ID: 456, Name: "李四", Age: 25}) }) 想美化JSON的输出,使用c.IndentedJSON方法即可,现在现在我们运行访问http://localhost:8080/users/456就可以看到JSON已经被美化了,更有层次感,适合人类阅读. { "id": 456, "name": "李四", "age": 25 }