首頁 > 後端開發 > Golang > 如何在 Go 中動態地將 JSON 資料解組為通用型別?

如何在 Go 中動態地將 JSON 資料解組為通用型別?

Linda Hamilton
發布: 2024-12-17 20:09:11
原創
135 人瀏覽過

How Can I Dynamically Unmarshal JSON Data into Generic Types in Go?

在Go 中利用JSON 解組中的通用類型

在Go 中,當面臨將JSON 資料解組到介面{}的挑戰時,了解如何動態地解組至關重要根據特定的鍵處理不同的資料類型。本文解決了這個問題,提供了一個將 JSON 解組為 Go 中的通用介面{}的解決方案。

問題

考慮一個場景,其中我們有一個名為 Message 的類型,其結構體包括一個 Cmd 欄位(字串)和一個資料欄位(interface{})。我們也有一個巢狀類型 CreateMessage 定義了特定的資料結構。當解組諸如'{"cmd":"create","data":{"conf":{"a":1},"info":{"b":2}}}' 之類的JSON 數據時,我們遇到資料欄位未正確轉換為適當的CreateMessage 類型的問題。

解決方案

要解決此問題,請採用以下方法方法:

  • 使用json.RawMessage 類型的資料欄位定義Message 類型以擷取訊息的變體部分。
  • 為每個不同的資料結構建立結構類型,例如 CreateMessage,並根據 Cmd 值將資料解組到其中。

這裡是一個範例程式碼片段示範了解決方案:

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")
    }
}
登入後複製

透過利用這種方法,JSON 資料可以動態地解組到適當的資料結構中,從而能夠在Go 中靈活處理變體JSON 資料。

以上是如何在 Go 中動態地將 JSON 資料解組為通用型別?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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