首頁 > 後端開發 > Golang > 如何在 Go 中使用嵌入式類型鍵解群組動態 JSON?

如何在 Go 中使用嵌入式類型鍵解群組動態 JSON?

Susan Sarandon
發布: 2024-12-08 01:48:16
原創
540 人瀏覽過

How to Unmarshal Dynamic JSON with an Embedded Type Key in Go?

使用嵌入式型別鍵解群組動態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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板