登录
首页 >  Golang >  Go问答

在 Go 中如何将具有嵌入结构字段的结构序列化为平面 JSON 对象?

来源:stackoverflow

时间:2024-02-26 08:33:26 274浏览 收藏

IT行业相对于一般传统行业,发展更新速度更快,一旦停止了学习,很快就会被行业所淘汰。所以我们需要踏踏实实的不断学习,精进自己的技术,尤其是初学者。今天golang学习网给大家整理了《在 Go 中如何将具有嵌入结构字段的结构序列化为平面 JSON 对象?》,聊聊,我们一起来看看吧!

问题内容

package main

import (
    "encoding/json"
    "fmt"
)

type city struct {
    city string `json:"city"`
    size int        `json:"size"`
}

type location struct {
    city city
    state string `json:"state"`
}

func main() {
    city := city{city: "san francisco", size: 8700000}
    loc := location{}
    loc.state = "california"
    loc.city = city
    js, _ := json.marshal(loc)
    fmt.printf("%s", js)
}

输出以下内容:

{"city":{"city":"san francisco","size":8700000},"state":"california"}

我想要的预期输出是:

{"city":"san francisco","size":8700000,"state":"california"}

我已经阅读了这篇有关自定义 json 编组的博客文章,但我似乎无法让它适用于具有另一个嵌入结构的结构。

我尝试通过定义自定义 marshaljson 函数来展平结构,但我仍然得到相同的嵌套输出:

func (l *Location) MarshalJSON() ([]byte, error) {
    return json.Marshal(&struct {
            City string `json:"City"`
            Size int    `json:"Size"`
            State string `json:"State"`
    }{
        City: l.City.City,
        Size: l.City.Size,
        State:   l.State,
    })
}

解决方案


使用匿名字段来展平 json 输出:

type city struct {
    city string `json:"city"`
    size int        `json:"size"`
}

type location struct {
    city     // <-- anonymous field has type, but no field name
    state string `json:"state"`
}

问题中忽略了 marshaljson 方法,因为代码对 location 值进行编码,但 marshaljson 方法是使用指针接收器声明的。通过编码 *location 进行修复。

js, _ := json.Marshal(&loc)  // <-- note &

以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于Golang的相关知识,也可关注golang学习网公众号。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>