为了账号安全,请及时绑定邮箱和手机立即绑定

在 Go 中将嵌套的 JSON 解组为平面结构

在 Go 中将嵌套的 JSON 解组为平面结构

Go
忽然笑 2023-05-08 17:58:04
假设我定义了一个结构如下:type User struct {    ID          string    Name        string    Age         uint    City        string      `json:"address.city"`    Province    string      `json:"address.province"`}我能够采用一个 User 结构,并将扁平化的恶魔扩展到一个嵌套的 JSON 结构中,并带有一个地址对象。然而,我正在努力走向另一个方向。我将如何使用以下 JSON:{    "ID": "1",    "Name": "Keith Baldwin",    "Age": 30,    "address": {        "city": "Saskatoon",        "province": "Saskatchewan"    }}并将其解组到给定的结构中?有没有我遗漏的东西,或者我只需要从头开始写,可能使用反射?
查看完整描述

3 回答

?
繁星淼淼

TA贡献1775条经验 获得超11个赞

创建用户信息类


type UserInfo struct {

    ID      string `json:"ID"`

    Name    string `json:"Name"`

    Age     int    `json:"Age"`

    Address struct {

        City     string `json:"city"`

        Province string `json:"province"`

    } `json:"address"`

}

然后将您的 json 数据解组为 userinfo 对象


var userInfo UserInfo

    jsonStr := `{

    "ID": "1",

    "Name": "Keith Baldwin",

    "Age": 30,

    "address": {

        "city": "Saskatoon",

        "province": "Saskatchewan"

    }

}`

json.Unmarshal([]byte(jsonStr), &userInfo)


查看完整回答
反对 回复 2023-05-08
?
慕妹3146593

TA贡献1820条经验 获得超9个赞

我认为您需要创建一个其他Address结构。


type Address struct {

    City     string `json:"city"`

    Province string `json:"province"`

}


type User struct {

    ID      string  `json:"id"`

    Name    string  `json:"name"`

    Age     uint    `json:"age"`

    Address Address `json:"address"`

}


查看完整回答
反对 回复 2023-05-08
?
小唯快跑啊

TA贡献1863条经验 获得超2个赞

您可以创建一个临时结构类型来将该数据转储到与您期望的格式匹配的格式中。例如


type userData struct {

    ID          string

    Name        string

    Age         uint

    address     map[string]string

}

尽管我最喜欢做的事情是将所有 json 转储到一个地图中,其中包含字符串键和 json.RawMessage 作为值。这将允许您将所有 json 解组到此映射中,然后根据需要解组每个字段。


var allData map[string]json.RawMessage

var user User{}

//Assuming we first get our json from a request, otherwise use json.Unmarshal(jsonData, &allData)

err := json.NewDecoder(r.Body).Decode(&allData)

if err != nil {

    //handle

}

err = json.Unmarshal(allData["ID"], &c.ID)

if err != nil {

    //handle

}

var addressMap map[string]string

err = json.Unmarshal(allData["address"], addressMap)

if err != nil {

    //handle

}

c.City = addressMap["city"]

c.Province = addressMap["province"]

我没有测试任何代码,因此它可能会出错,但这只是为了传达将所有数据转换为 json.RawMessage 值的映射然后解组每个属性的想法。通常你会有更多的错误检查来查看值是否存在等。当然,它需要更多的工作,但它非常灵活,让你对数据的处理方式有更多的可见性和权力,而不是仅仅解组到一个结构并希望魔法起作用。


查看完整回答
反对 回复 2023-05-08
  • 3 回答
  • 0 关注
  • 145 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信