ホームページ > バックエンド開発 > Golang > Go で JSON データを動的にジェネリック型にアンマーシャリングするにはどうすればよいですか?

Go で JSON データを動的にジェネリック型にアンマーシャリングするにはどうすればよいですか?

Linda Hamilton
リリース: 2024-12-17 20:09:11
オリジナル
134 人が閲覧しました

How Can I Dynamically Unmarshal JSON Data into Generic Types in Go?

Go を使用した JSON アンマーシャリングでのジェネリック型の利用

Go では、JSON データをインターフェースにアンマーシャリングするという課題に直面するとき、{}特定のキーに基づいてさまざまなデータ型を処理します。この記事では、この問題に対処し、JSON を Go の汎用インターフェースにアンマーシャリングするソリューションを提供します。

問題

次の構造体を持つ Message という型があるシナリオを考えてみましょう。{} Cmd フィールド (文字列) と Data フィールド (interface{})。特定のデータ構造を定義するネストされたタイプ CreateMessage もあります。 '{"cmd":"create","data":{"conf":{"a":1},"info":{"b":2}}}' などの JSON データをアンマーシャリングするときに、次のような問題が発生します。 Data フィールドが適切な CreateMessage タイプに正しく変換されない問題。

解決策

この問題に対処するには、次の方法を採用します。アプローチ:

  • メッセージのバリアント部分をキャプチャするために、json.RawMessage 型の Data フィールドを持つ Message 型を定義します。
  • 異なるデータ構造ごとに構造体型を作成します。 CreateMessage などを作成し、Cmd 値に基づいてデータをアンマーシャリングします。

例を示します。解決策を示すコード スニペット:

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")
    }
}
ログイン後にコピー

このアプローチを活用すると、JSON データを適切なデータ構造に動的にアンマーシャリングでき、Go でバリアント JSON データを柔軟に処理できるようになります。

以上がGo で JSON データを動的にジェネリック型にアンマーシャリングするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート