Go で JSON をインターフェースにアンマーシャリングする
特定のフィールドに応じてさまざまなデータ構造を持つ JSON 文字列があるシナリオを考えてみましょう。 「cmd」フィールドとして。この JSON をインターフェース{} タイプのフィールドを含む Go 構造体にアンマーシャリングし、「cmd」値に基づいてさまざまなデータ構造に適応させたいと考えています。
ソリューション
これを実現するには、固定フィールドとバリアント データを保持する json.RawMessage フィールドを含む基本構造体を定義します。次に、バリアントごとに特定の構造体タイプを作成し、コマンドに基づいてアンマーシャルします。
例:
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") } }
この例では、Message 構造体はメッセージ構造全体を表します。 「cmd」フィールドとバリアント データを保持する json.RawMessage フィールド。 CreateMessage は、「create」コマンド バリアントを表す特定の構造体タイプです。
コードは、初期 JSON 文字列を Message 変数にアンマーシャルし、次に、「cmd」フィールドを使用して、どの特定のバリアントをアンマーシャルして出力するかを決定します。
以上が動的フィールド値に基づいて JSON を Go インターフェイスにアンマーシャリングする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。