I am trying to create a struct where a field can hold data of a few particular types, say int
, string
and a CustomType
. I want to decode/encode this struct to/from JSON. How can we achieve this in go/golang?
For example, I have a struct for the following definition:
type MyData struct {
Name string `json:"name"`
Value int32 `json:"value"`
Param <can be either int, string or CustomType> `json:"param"`
}
Where CustomType
is
type CustomType struct {
Custom bool `json:"custom"`
}
Let's say I need to unmarshal the following JSONs to the above struct MyData
:
{
"name": "Hello",
"value": 32
"param": "World"
}
And this one:
{
"name": "Hello",
"value": 32
"param": 100
}
And this one also:
{
"name": "Hello",
"value": 32
"param": {
"custom": true
}
}
How do I achieve this?
Can I define my own MarshalJSON
and UnmarshalJSON
on MyData
and achieve this?
Or is there a way of defining a custom type, say IntOrStringOrCustom
and define MyData
as
type MyData struct {
Name string `json:"name"`
Value int32 `json:"value"`
Param IntOrStringOrCustom `json:"param"`
}
and then define MarshalJSON
and UnmarshalJSON
on IntOrStringOrCustom
?
I have also seen json.RawMessage
. Can we use it somehow here?
Issue with using interface{}
is that I will have to write the encoding/decoding logic everywhere, where I am trying to use this data. Or is there an elegant way of doing this with interface{}
?