golang 框架 beego ServeJSON的数据到底应该用什么类型?

发布于 2022-09-11 18:02:52 字数 236 浏览 28 评论 0

mystruct := &JSONStruct{0, "hello"}
fmt.Println(mystruct)
c.Data["json"] = mystruct
c.ServeJSON()

按以上写法是通过的
但是

mystruct := JSONStruct{0, "hello"}

这样写也可以通过
到底哪种合理?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

烧了回忆取暖 2022-09-18 18:02:52

我没有太理解你的问题, 你是想问 c.Data["json"] 是 JSONStruct的值和指针的区别吗, 为什么用指针和值都可以得到正确的输出?这个问题我建议你看 c.ServeJSON()的源码就明白了

// ServeJson sends a json response with encoding charset.
func (c *Controller) ServeJson(encoding ...bool) {
    var hasIndent bool
    var hasencoding bool
    if RunMode == "prod" {
        hasIndent = false
    } else {
        hasIndent = true
    }
    if len(encoding) > 0 && encoding[0] == true {
        hasencoding = true
    }
    c.Ctx.Output.Json(c.Data["json"], hasIndent, hasencoding)
}

// Json writes json to response body.
// if coding is true, it converts utf-8 to \u0000 type.
func (output *BeegoOutput) Json(data interface{}, hasIndent bool, coding bool) error {
    output.Header("Content-Type", "application/json; charset=utf-8")
    var content []byte
    var err error
    if hasIndent {
        content, err = json.MarshalIndent(data, "", "  ")
    } else {
        content, err = json.Marshal(data)
    }
    if err != nil {
        http.Error(output.Context.ResponseWriter, err.Error(), http.StatusInternalServerError)
        return err
    }
    if coding {
        content = []byte(stringsToJson(string(content)))
    }
    output.Body(content)
    return nil
}

实际这个方法是对json序列化和 http 响应的封装, 只是直接把 c.Data["json"] 传递给json组件了而已, json 内部会进行反射, 会自动处理指针类型的数据,和我们平时使用没有任何区别, 只要是 json组件可以序列化的数据都可以给 c.Data["json"] ,而 c.Data 是 map[interface{}]interface{} 类型的数据

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文