在我的項目中,我定義了結構以便從 JSON 獲取數據。我嘗試使用json.Unmarshal()函數。但它不適用于自定義類型屬性。有一個這樣的結構:type TestModel struct { ID NullInt `json:"id"` Name string `json:"name"`}在那里,NullInt類型是通過MarshalJSON()和UnmarshalJSON()函數的實現來定義的:// NullInt ...type NullInt struct { Int int Valid bool}// MarshalJSON ...func (ni NullInt) MarshalJSON() ([]byte, error) { if !ni.Valid { return []byte("null"), nil } return json.Marshal(ni.Int)}// UnmarshalJSON ...func (ni NullInt) UnmarshalJSON(b []byte) error { fmt.Println("UnmarshalJSON...") err := json.Unmarshal(b, &ni.Int) ni.Valid = (err == nil) fmt.Println("NullInt:", ni) return err}在main()功能上,我實現了:func main() { model := new(TestModel) JSON := `{ "id": 1, "name": "model" }` json.Unmarshal([]byte(JSON), &model) fmt.Println("model.ID:", model.ID) }在控制臺中,我得到:UnmarshalJSON...NullInt: {1 true}model.ID: {0 false}正如您所看到的,NullInt.UnmarshalJSON()被調用并且ni是我所期望的但model.ID值。 實現功能的正確方法是什么UnmarshalJSON()?另外,當我設置:(JSON := `{"name": "model"}`沒有id)時,控制臺只是:model.ID: {0 false}這意味著,該UnmarshalJSON()函數沒有被調用,然后我沒有model.ID以正確的方式獲得 的值。
1 回答

胡子哥哥
TA貢獻1825條經驗 獲得超6個贊
UnmarshalJSON()需要修改接收者,所以必須使用指針接收者:
func (ni *NullInt) UnmarshalJSON(b []byte) error {
// ...
}
接收者和所有參數只是副本,如果不使用指針,則只能修改副本,該副本在方法返回后將被丟棄。如果您使用指針接收器,那也只是一個副本,但指向的值將是相同的,因此您可以修改原始(指向)對象。
為了保持一致性,其他方法也使用指針接收器。
通過此更改,它可以工作并輸出(在Go Playground上嘗試):
UnmarshalJSON...
NullInt: &{1 true}
model.ID: {1 true}
- 1 回答
- 0 關注
- 142 瀏覽
添加回答
舉報
0/150
提交
取消