In my project, I've defined structures so that get data from JSON.
I tried to use json.Unmarshal()
function. But it did not work for custom type attribute.
There is a structure like this:
type TestModel struct {
ID NullInt `json:"id"`
Name string `json:"name"`
}
In there, NullInt
type was defined with implementations of MarshalJSON()
and UnmarshalJSON()
function:
// 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
}
In main()
function, I implemented:
func main() {
model := new(TestModel)
JSON := `{
"id": 1,
"name": "model"
}`
json.Unmarshal([]byte(JSON), &model)
fmt.Println("model.ID:", model.ID)
}
In console, I got:
UnmarshalJSON...
NullInt: {1 true}
model.ID: {0 false}
As you can see, NullInt.UnmarshalJSON()
was called and ni
was what I expected but model.ID
's value.
What is the right way to implement UnmarshalJSON()
function?
To addition, when I set: JSON := `{"name": "model"}`
(without id
), console just was:
model.ID: {0 false}
That means, the UnmarshalJSON()
function wasn't called then I didn't get model.ID
's value in right way.