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)

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"`
}

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 值的映射然后解組每個屬性的想法。通常你會有更多的錯誤檢查來查看值是否存在等。當然,它需要更多的工作,但它非常靈活,讓你對數據的處理方式有更多的可見性和權力,而不是僅僅解組到一個結構并希望魔法起作用。
- 3 回答
- 0 關注
- 194 瀏覽
添加回答
舉報