任意のキーと値のペアを使用して 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 サイトの他の関連記事を参照してください。