亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 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 關注
  • 194 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號