ホームページ >バックエンド開発 >Golang >JSON を Go インターフェースにマーシャリングし、それを特定の型に動的に変換するにはどうすればよいですか?{}

JSON を Go インターフェースにマーシャリングし、それを特定の型に動的に変換するにはどうすればよいですか?{}

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-20 21:28:14726ブラウズ

How Can I Marshal JSON into a Go Interface{} and Dynamically Convert it to a Specific Type?

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 サイトの他の関連記事を参照してください。

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