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

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

Barbara Streisand
Barbara Streisand原創
2024-10-29 05:41:02694瀏覽

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

使用任意鍵/值對解組JSON 到結構

問題

您有一個包含已知和未知欄位組合的JSON 字串。您需要解析此 JSON 並將已知欄位對應到結構體,同時保留未知欄位。

解決方案1:雙重Unmarshal

type KnownFields struct {
    Known1 string
    Known2 string
}

type Message struct {
    Known1   string                        `json:"known1"`
    Known2   string                        `json:"known2"`
    Unknowns map[string]interface{} `json:"-"`
}

func ParseMessage(jsonStr string) (*Message, error) {
    var knownFields KnownFields
    if err := json.Unmarshal([]byte(jsonStr), &knownFields); err != nil {
        return nil, err
    }

    var m map[string]interface{}
    if err := json.Unmarshal([]byte(jsonStr), &m); err != nil {
        return nil, err
    }

    delete(m, "known1")
    delete(m, "known2")

    return &Message{
        Known1:   knownFields.Known1,
        Known2:   knownFields.Known2,
        Unknowns: m,
    }, nil
}

解決方案2:直接解組到Map[string] 介面{}

type Message map[string]interface{}

func ParseMessage(jsonStr string) (*Message, error) {
    var m Message
    if err := json.Unmarshal([]byte(jsonStr), &m); err != nil {
        return nil, err
    }

    return &m, nil
}

附加選項:解組到介面{}

func ParseMessage(jsonStr string) (interface{}, error) {
    var m interface{}
    if err := json.Unmarshal([]byte(jsonStr), &m); err != nil {
        return nil, err
    }

    return m, nil
}

之間的選擇這些選項取決於您的特定要求。解決方案 1 提供了一種結構化的 Message 類型,可以清楚地區分已知欄位和未知欄位。解決方案 2 提供了更靈活的方法,讓您以地圖的形式存取所有欄位。解決方案 3 提供了一種將 JSON 解組為非類型化介面的簡化方法,然後您可以根據需要進行處理。

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

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