ホームページ > バックエンド開発 > Golang > 動的フィールド値に基づいて JSON を Go インターフェイスにアンマーシャリングする方法

動的フィールド値に基づいて JSON を Go インターフェイスにアンマーシャリングする方法

Barbara Streisand
リリース: 2024-12-21 20:01:11
オリジナル
592 人が閲覧しました

How to Unmarshal JSON into Go Interfaces Based on a Dynamic Field Value?

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

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