假設我有兩個這樣相關的結構:
type SecretUser struct {
UserInfo `json:"userInfo"`
Password string `json:"password"`
}
type UserInfo struct {
FirstName string `json:"firstName"`
LastName string `json:"lastName"`
Email string `json:"email"`
}
我收到了這種形式的 JSON:
{
"firstName": "nice",
"lastName":"guy",
"email":"[email protected]",
"password":"abc123"
}
我想將此 JSON 解組為 SecretUser。有沒有比這樣做更好的方法?
func (u *User) UnmarshalJSON(data []byte) error {
var objmap map[string]*json.RawMessage
var password string
var err error
err = json.Unmarshal(data, &objmap)
if err != nil {
return err
}
if err := json.Unmarshal(data, &u.UserInfo); err != nil {
return err
}
err = json.Unmarshal(*objmap["password"], &password)
if err != nil {
return err
}
u.Password = password
return nil
}
基本上,我將 JSON 部分解組為 UserInfo 結構,然后再次讀取它以提取密碼。我不想創建另一個結構來干凈地解組這個 JSON 或使用外部庫(除非它是標準的一部分)。有沒有更干凈/有效的方法來執行此操作,而無需兩次讀取 JSON 或從地圖手動設定每個欄位?
uj5u.com熱心網友回復:
只需將 UserData 包含到 SecretUser 結構中,并且不要為其指定 json 標記。
type UserInfo struct {
FirstName string `json:"firstName"`
LastName string `json:"lastName"`
Email string `json:"email"`
}
type SecretUser struct {
UserInfo
Password string `json:"password"`
}
func main() {
data := []byte(`{"firstName": "nice","lastName":"guy","email":"[email protected]","password":"abc123"}`)
var u SecretUser
json.Unmarshal(data, &u)
fmt.Println(u)
}
去玩空間示例
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/438856.html
