我想創建一個結構,其中一個字段可以舉行一些特定類型的數據,說int
,string
和CustomType
。我想解碼/編碼這個結構到/從JSON。 go/golang如何實現這一目標?編碼/解碼的多類型字段golang
例如,我有如下定義一個結構:
type MyData struct {
Name string `json:"name"`
Value int32 `json:"value"`
Param <can be either int, string or CustomType> `json:"param"`
}
哪裏CustomType
是
type CustomType struct {
Custom bool `json:"custom"`
}
比方說,我需要解組以下JSONs上述結構MyData
:
{
"name": "Hello",
"value": 32
"param": "World"
}
而這一個:
{
"name": "Hello",
"value": 32
"param": 100
}
而這其中也:
{
"name": "Hello",
"value": 32
"param": {
"custom": true
}
}
如何實現這一目標?
我可以在MyData
上定義我自己的MarshalJSON
和UnmarshalJSON
並實現此目的嗎?
或者是有定義的自定義類型的方式,說IntOrStringOrCustom
並定義MyData
爲
type MyData struct {
Name string `json:"name"`
Value int32 `json:"value"`
Param IntOrStringOrCustom `json:"param"`
}
然後定義上IntOrStringOrCustom
MarshalJSON
和UnmarshalJSON
?我也看過json.RawMessage
。我們能以某種方式在這裏使用它嗎?
使用interface{}
的問題是,我將不得不編寫編碼/解碼邏輯,我試圖使用這些數據。或者有沒有一個這樣做的優雅方式interface{}
?
感謝尤金。我希望能夠將解組僅限制爲指定的類型。使用和接口將導致對密鑰的任何類型的值進行成功解組。無論如何可以做到嗎? – Shahidh
@ Shahidh是的。我已更新。你能檢查一下嗎? –
再次感謝尤金。我們已經嘗試過這種方法,它工作。但問題是我們有很多結構需要進行驗證。所以,爲每個結構寫'MarshaJSON'和'UnmarshalJSON'並不是一個可行的解決方案。可悲的是,我無法將這些方法寫入'interface {}'。否則,我會寫它爲'TheParam'。 但是,我們發現了另一種方法,我們可以通過使用像https://github.com/asaskevich/govalidator這樣的包添加'validate'標籤來進行結構驗證。現在試試看。將更新,如果這是前進的方式 – Shahidh