使用嵌入式型別鍵解群組動態JSON
在Go 中,可以將JSON 資料解組到具有動態型別欄位的結構欄位中具有挑戰性的。本文探討了一種利用自訂結構體和嵌入式類型鍵來實現此目的的解決方案。
問題陳述
考慮以下JSON 結構:
{ "some_data": "foo", "dynamic_field": { "type": "A", "name": "Johnny" }, "other_data": "bar" }
我們想要將此JSON 解組到一個Go 結構中,該結構具有介面類型Something 的欄位DynamicField。根據 JSON 中 type 鍵的值,DynamicField 應對應於 DynamicTypeA 或 DynamicTypeB。
解決方案
為了解決此問題,我們定義以下自訂structs:
type Something interface { GetType() string } type DynamicType struct { Type string `json:"type"` Value interface{} `json:"-"` // Not exported }
DynamicType 表示動態字段,內嵌Type 鍵鍵以確定該欄位的實際類型資料。 Value 欄位不會匯出,以防止直接存取。
接下來,我們定義Go 結構體來表示JSON:
type BigStruct struct { SomeData string `json:"some_data"` DynamicField DynamicType `json:"dynamic_field"` OtherData string `json:"other_data"` }
最後,我們為DynamicType 實作UnmarshalJSON 方法:
func (d *DynamicType) UnmarshalJSON(data []byte) error { var typ struct { Type string `json:"type"` } if err := json.Unmarshal(data, &typ); err != nil { return err } switch typ.Type { case "A": d.Value = new(DynamicTypeA) case "B": d.Value = new(DynamicTypeB) } return json.Unmarshal(data, d.Value) }
此方法解組鍵,然後根據類型建立適當的結構體(DynamicTypeA 或DynamicTypeB)值。然後,它將剩餘的 JSON 資料解組到已建立的結構中,然後將其儲存在 Value 欄位中。
以上是如何在 Go 中使用嵌入式類型鍵解群組動態 JSON?的詳細內容。更多資訊請關注PHP中文網其他相關文章!