首頁 > 後端開發 > Golang > 如何根據動態欄位值將 JSON 解組到 Go 介面?

如何根據動態欄位值將 JSON 解組到 Go 介面?

Barbara Streisand
發布: 2024-12-21 20:01:11
原創
592 人瀏覽過

How to Unmarshal JSON into Go Interfaces Based on a Dynamic Field Value?

將JSON 解組到Go 中的介面

考慮這樣的場景,您有一個JSON 字串,它具有取決於特定欄位的不同資料結構,例如作為“cmd”欄位。您希望將此 JSON 解組到包含一個具有 interface{} 類型的欄位的 Go 結構體中,並根據「cmd」值使其適應不同的資料結構。

解決方案

要實現此目的,請定義一個具有固定字段的基本結構和一個 json.RawMessage 字段來保存變體資料。然後,為每個變體建立特定的結構類型,並根據命令解組它們。

例如:

type Message struct {
  Cmd string `json:"cmd"`
  Data      json.RawMessage
}  

type CreateMessage struct {
    Conf map[string]int `json:"conf"`
    Info map[string]int `json:"info"`
}  

func main() {
    var m Message
    if err := json.Unmarshal(data, &m); err != nil {
        log.Fatal(err)
    }
    switch m.Cmd {
    case "create":
        var cm CreateMessage
        if err := json.Unmarshal([]byte(m.Data), &cm); err != nil {
            log.Fatal(err)
        }
        fmt.Println(m.Cmd, cm.Conf, cm.Info)
    default:
        log.Fatal("bad command")
    }
}
登入後複製

在此範例中,Message 結構代表整體訊息結構,包含「cmd」欄位和 json.RawMessage 欄位用於保存變體資料。 CreateMessage 是表示「建立」指令變體的特定結構類型。

程式碼將初始 JSON 字串解組為 Message 變量,然後使用「cmd」欄位確定要解組和列印的特定變體。

以上是如何根據動態欄位值將 JSON 解組到 Go 介面?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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