使用 gin gonic 返回文字 JSON 的最简单方法

Posted

技术标签:

【中文标题】使用 gin gonic 返回文字 JSON 的最简单方法【英文标题】:Simplest way to return literal JSON using gin gonic 【发布时间】:2019-11-01 23:54:41 【问题描述】:

我正在通过为 Web 服务器构建一个简单的 API 接口来学习 Go。当命中默认路由时,我想以 JSON 格式返回一条简单消息。

到目前为止,在线阅读,这是返回文字 JSON 字符串,并将其编码并发送给用户的最简单方法。

func GetDefault(c *gin.Context)  
    jsonData := []byte(`"msg":"this worked"`)

    var v interface
    json.Unmarshal(jsonData, &v)
    data := v.(map[string]interface)  

    c.JSON(http.StatusOK,data)

这是最有效/最快的方法吗?

在 node.js 和 express 中,我会做类似的事情:

return res.status(200).json("msg":"this worked");

在 Go + Gin 中最好的方法是什么?

【问题讨论】:

c.JSON(http.StatusOK, map[string]string"msg":"this worked") 更接近 node.js 示例。 @mkopriva 询问者已准备好 JSON 响应作为 string 值。 @icza 我注意到,但是节点中的"msg":"this worked" 不是字符串文字,而是一个对象。所以我推断如果他们可以在节点中使用一个对象,为什么不能在 go 中使用地图? 是的,不一定需要是字符串,示例 node.js 代码就是我的目标。无需使用预定义结构即可轻松构建的对象。 【参考方案1】:

一种选择是使用Context.Data(),您可以在其中提供要发送的数据(连同内容类型):

func GetDefault(c *gin.Context)  
    jsonData := []byte(`"msg":"this worked"`)

    c.Data(http.StatusOK, "application/json", jsonData)

您也可以为内容类型使用常量:

func GetDefault(c *gin.Context)  
    jsonData := []byte(`"msg":"this worked"`)

    c.Data(http.StatusOK, gin.MIMEJSON, jsonData)

如果您的数据可用作string 值并且很大,如果您使用Context.DataFromReader(),则可以避免将其转换为[]byte

func GetDefault(c *gin.Context) 
    jsonStr := `"msg":"this worked"`

    c.DataFromReader(http.StatusOK,
        int64(len(jsonStr)), gin.MIMEJSON, strings.NewReader(jsonStr), nil)

如果您的 JSON 格式为 io.Reader,此解决方案也适用,例如一个os.File

【讨论】:

【参考方案2】:

您可以在响应中使用gin.H 结构:

c.JSON(http.StatusOK, gin.H"msg":"this worked")

【讨论】:

以上是关于使用 gin gonic 返回文字 JSON 的最简单方法的主要内容,如果未能解决你的问题,请参考以下文章

gin接收参数和返回数据

gin-gonic Go轻量级restful服务

Gin_响应

golang gin 中间件,返回结果

XMLJSONYAML和ProtoBuf 渲染

Gin_渲染