首頁 >後端開發 >Golang >如何將帶有任意鍵/值對的 JSON 解組到 Go 中的結構中?

如何將帶有任意鍵/值對的 JSON 解組到 Go 中的結構中?

DDD
DDD原創
2024-10-26 16:35:30830瀏覽

How to Unmarshal JSON with Arbitrary Key/Value Pairs into a Struct in Go?

Unmarshal JSON with Arbitrary Key/Value Pairs to Struct

關於將具有未知/任意鍵/值對的JSON 解組到結構中,已經提出了許多類似的問題。然而,找到的解決方案都沒有提供簡單而優雅的方法來實現這一點。

問題陳述

我們有一個 JSON 字串,其中包含已知欄位(始終存在)和未知數量的未知/任意欄位。範例:

<code class="json">{"known1": "foo", "known2": "bar", "unknown1": "car", "unknown2": 1}</code>

在此範例中,known1 和known2 是已知字段,而unknown1 和unknown2 是任意字段。未知欄位可以有任何名稱(鍵)和值(字串、布林、float64 或 int)。

我們的目標是找到一種慣用的方法將此類 JSON 訊息解析為結構。

建議的解決方案

我們可以定義以下結構:

<code class="go">type Message struct {
    Known1   string `json:"known1"`
    Known2   string `json:"known2"`
    Unknowns []map[string]interface{}
}</code>

使用此結構,範例JSON 訊息應產生以下結果:

{Known1:foo Known2:bar Unknowns:[map[unknown1:car] map[unknown2:1]]}

替代解決方案

另一個選項是將JSON 解組到映射[string]介面{}:

<code class="go">import (
    "encoding/json"
    "fmt"
)

func main() {
    jsonMsg := `{"known1": "foo", "known2": "bar", "unknown1": "car", "unknown2": 1}`
    var msg map[string]interface{}
    fmt.Println(json.Unmarshal([]byte(jsonMsg), &msg))
    fmt.Printf("%+v", msg)
}</code>

這將產生:

<nil>
map[known1:foo known2:bar unknown1:car unknown2:1]

的優點這種方法是我們可以迭代鍵和值並執行必要的類型斷言來處理資料。根據我們的需要,我們可能會也可能不會用資料填充結構。

以上是如何將帶有任意鍵/值對的 JSON 解組到 Go 中的結構中?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn