ホームページ > バックエンド開発 > Golang > Go で埋め込み型キーを使用して動的 JSON をアンマーシャリングする方法

Go で埋め込み型キーを使用して動的 JSON をアンマーシャリングする方法

Susan Sarandon
リリース: 2024-12-08 01:48:16
オリジナル
541 人が閲覧しました

How to Unmarshal Dynamic JSON with an Embedded Type Key in Go?

埋め込み型キーを使用した動的 JSON のアンマーシャリング

Go では、JSON データを動的型のフィールドを持つ構造体にアンマーシャリングできます。挑戦的。この記事では、カスタム構造体と埋め込み型キーを利用してこれを実現するソリューションについて説明します。

問題ステートメント

次の JSON 構造を考えてみましょう:

{
  "some_data": "foo",
  "dynamic_field": { "type": "A", "name": "Johnny" },
  "other_data": "bar"
}
ログイン後にコピー

この JSON を、インターフェース型のフィールド DynamicField を持つ Go 構造体にアンマーシャリングしたいと考えています。 何か。 JSON 内の type キーの値に応じて、DynamicField は DynamicTypeA または DynamicTypeB のいずれかに対応する必要があります。

解決策

この問題を解決するには、次のカスタムを定義します。 structs:

type Something interface {
  GetType() string
}

type DynamicType struct {
  Type   string      `json:"type"`
  Value  interface{} `json:"-"` // Not exported
}
ログイン後にコピー

DynamicType は動的フィールドを表します。データの実際のタイプを決定するために埋め込まれた Type キー。直接アクセスを防ぐため、Value フィールドはエクスポートされません。

次に、JSON を表す Go 構造体を定義します。

type BigStruct struct {
  SomeData     string      `json:"some_data"`
  DynamicField DynamicType `json:"dynamic_field"`
  OtherData    string      `json:"other_data"`
}
ログイン後にコピー

最後に、DynamicType の UnmarshalJSON メソッドを実装します。

func (d *DynamicType) UnmarshalJSON(data []byte) error {
  var typ struct {
    Type string `json:"type"`
  }
  if err := json.Unmarshal(data, &typ); err != nil {
    return err
  }
  switch typ.Type {
  case "A":
    d.Value = new(DynamicTypeA)
  case "B":
    d.Value = new(DynamicTypeB)
  }
  return json.Unmarshal(data, d.Value)
}
ログイン後にコピー

このメソッドは、型キーをアンマーシャリングしてから、適切な構造体を作成します(DynamicTypeA または DynamicTypeB) 値に基づきます。次に、残りの JSON データを作成された構造体にアンマーシャリングし、値フィールドに保存します。

以上がGo で埋め込み型キーを使用して動的 JSON をアンマーシャリングする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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