ホームページ  >  記事  >  バックエンド開発  >  Go で任意のキーと値のペアを持つ JSON を構造体にアンマーシャリングする方法

Go で任意のキーと値のペアを持つ JSON を構造体にアンマーシャリングする方法

Barbara Streisand
Barbara Streisandオリジナル
2024-10-29 05:41:02643ブラウズ

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

任意のキーと値のペアを使用して JSON をアンマーシャルして構造化する

問題

既知のフィールドと未知のフィールドを組み合わせた JSON 文字列。この JSON を解析し、未知のフィールドを保持しながら既知のフィールドを構造体にマップする必要があります。

解決策 1: Double 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 は、既知のフィールドと未知のフィールドを明確に分離する構造化されたメッセージ タイプを提供します。解決策 2 は、より柔軟なアプローチを提供し、すべてのフィールドにマップとしてアクセスできるようにします。解決策 3 は、JSON を型なしインターフェイスにアンマーシャリングし、必要に応じて処理できる簡単な方法を示しています。

以上がGo で任意のキーと値のペアを持つ JSON を構造体にアンマーシャリングする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。