Go で JSON をインターフェースにマーシャリングする
複雑なデータ構造を扱う場合、多くの場合、JSON をインターフェースにマーシャリングする必要があります。{}柔軟性と多態性を可能にします。この記事では、JSON をインターフェースにマーシャリングし、フィールドの値に基づいて特定のタイプに動的に変換するという特定のシナリオに対する解決策を提供します。
問題の説明
次の状況を考えてみましょう。Data という名前のインターフェース フィールドを持つ Message タイプがあるとします。{} Data フィールドの特定のバリアントを表す CreateMessage タイプもあります。コマンド(この場合は「create」)と CreateMessage タイプに一致するデータの両方を含む JSON 文字列をアンマーシャリングすると、データがインターフェースとして残るという問題が発生します。
解決策
この問題を解決するには、Go の型システムと JSON の柔軟性を活用する必要があります。新しい構造体タイプ Message を定義します。これは、元の Message タイプを埋め込み、Data という名前の RawMessage フィールドを追加します。 RawMessage は、encoding/json パッケージによって提供される特別な型で、型情報を失うことなく任意の JSON データを保存できます。
type Message struct { Cmd string Data json.RawMessage }
次に、Data フィールドの各バリアントの構造体の型を定義します。 CreateMessage:
type CreateMessage struct { Conf map[string]int Info map[string]int }
の場合、アンマーシャリング コードで Cmd フィールドの値をオンにしてデータをデコードできます。適切な具象型に変換します:
switch m.Cmd { case "create": var cm CreateMessage if err := json.Unmarshal(m.Data, &cm); err != nil { log.Fatal(err) } fmt.Println(m.Cmd, cm.Conf, cm.Info) default: log.Fatal("bad command") }
このアプローチにより、後で既知の値に基づいて特定の型に変換する機能を維持しながら、JSON をインターフェースにアンマーシャリングできます。
以上がJSON を Go インターフェースにマーシャリングし、それを特定の型に動的に変換するにはどうすればよいですか?{}の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。