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

假设我定义了一个结构如下:


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"

    }

}

并将其解组到给定的结构中?


有没有我遗漏的东西,或者我只需要从头开始写,可能使用反射?


忽然笑
浏览 146回答 3
3回答

繁星淼淼

创建用户信息类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)

慕妹3146593

我认为您需要创建一个其他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"`}

小唯快跑啊

您可以创建一个临时结构类型来将该数据转储到与您期望的格式匹配的格式中。例如type userData struct {    ID          string    Name        string    Age         uint    address     map[string]string}尽管我最喜欢做的事情是将所有 json 转储到一个地图中,其中包含字符串键和 json.RawMessage 作为值。这将允许您将所有 json 解组到此映射中,然后根据需要解组每个字段。var allData map[string]json.RawMessagevar 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]stringerr = json.Unmarshal(allData["address"], addressMap)if err != nil {    //handle}c.City = addressMap["city"]c.Province = addressMap["province"]我没有测试任何代码,因此它可能会出错,但这只是为了传达将所有数据转换为 json.RawMessage 值的映射然后解组每个属性的想法。通常你会有更多的错误检查来查看值是否存在等。当然,它需要更多的工作,但它非常灵活,让你对数据的处理方式有更多的可见性和权力,而不是仅仅解组到一个结构并希望魔法起作用。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go