ホームページ >バックエンド開発 >Golang >ジェネリックフィールドを使用せずに型キーに基づいてGoで動的JSONをアンマーシャリングする方法は?

ジェネリックフィールドを使用せずに型キーに基づいてGoで動的JSONをアンマーシャリングする方法は?

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-19 10:49:12322ブラウズ

How to Unmarshal Dynamic JSON in Go Based on a Type Key Without Generic Fields?

ジェネリック フィールドを導入せずに型キーに基づいて動的 JSON をアンマーシャリングする

多くの構造化 JSON データは Go 構造体にアンマーシャリングする必要があり、多くの場合、ネストされたフィールドが含まれますさまざまなデータ型を使用します。ネストされたフィールドのデータ型が JSON 内の型キーに基づいて異なる場合、カスタム フィールドを使用した従来のアンマーシャリング方法では、不必要なボイラープレート コードが発生する可能性があります。

これに関連して、次の JSON 仕様を考えてみましょう。

{
  "some_data": "foo",
  "dynamic_field": { "type": "A", "name": "Johnny" },
  "other_data": "bar"
}

{
  "some_data": "foo",
  "dynamic_field": { "type": "B", "address": "Somewhere" },
  "other_data": "bar"
}

これらの JSON ドキュメントは両方とも、同じ Go 構造体:

type BigStruct struct {
  SomeData     string    `json:"some_data"`
  DynamicField Something `json:"dynamic_field"`
  OtherData    string    `json:"other_data"`
}

課題は、'dynamic_field' オブジェクト内の 'type' キーに基づいて動的データを収容できる 'Something' 型を定義することにあります。

回避するには明示的な「汎用」フィールド (値、データなど) が必要な場合は、型埋め込みの力を活用できます。

type BigStruct struct {
  SomeData     string      `json:"some_data"`
  DynamicField DynamicType `json:"dynamic_field"`
  OtherData    string      `json:"other_data"`
}

type DynamicType struct {
  Value interface{}
}

「DynamicType」内の「Value」フィールドは、JSON の「type」キーに基づいて、任意のタイプのデータを保持できます。適切なアンマーシャリングを容易にするために、「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(TypeA)
    case "B":
        d.Value = new(TypeB)
    }
    return json.Unmarshal(data, d.Value)
}

さまざまなタイプのデータに特定のタイプを定義します。

type TypeA struct {
    Name string `json:"name"`
}

type TypeB struct {
    Address string `json:"address"`
}

このアプローチでは、次のことができます。追加の汎用フィールドを必要とせずに JSON ドキュメントをアンマーシャリングし、クリーンで拡張可能なデータを維持できるようにします。構造。

以上がジェネリックフィールドを使用せずに型キーに基づいてGoで動的JSONをアンマーシャリングする方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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