【发布时间】:2019-09-13 10:50:19
【问题描述】:
在我的项目中,我定义了从 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 的值。
【问题讨论】:
标签: json pointers go struct unmarshalling