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

Go で型キーに基づいて動的 JSON フィールドをアンマーシャリングする方法

Susan Sarandon
Susan Sarandonオリジナル
2024-12-05 20:17:10490ブラウズ

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

型キーに基づいて動的 JSON をアンマーシャリングする

JSON 構造に動的フィールドが含まれる場合、複雑な JSON データを Go 構造体にアンマーシャリングするのは困難になる場合がありますさまざまな種類の。この記事では、JSON フィールドが主に単純な値を保持しますが、場合によっては特定の型キーを持つ動的フィールドによってフィールドの値の型が決定されるという特定のシナリオについて説明します。

目標は、同じ値を持つ Go 構造体を作成することです。構造は提供された JSON として使用され、動的フィールドはインターフェイス タイプとして表され、そのタイプに基づいた柔軟な処理が可能になります。

考えられる解決策の 1 つは、次のカスタムを利用します。タイプ:

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

type Something interface {
    GetType() string
}

次に、動的フィールドのタイプごとに個別の構造体を作成します:

type BaseDynamicType struct {
    Type string `json:"type"`
}

type DynamicTypeA struct {
    BaseDynamicType
    Name string `json:"name"`
}

type DynamicTypeB struct {
    BaseDynamicType
    Address string `json:"address"`
}

func (d *BaseDynamicType) GetType() string {
    return d.Type
}

JSON をこの構造体にアンマーシャリングするために、BigStruct はカスタム UnmarshalJSON メソッドを実装できます:

func (b *BigStruct) UnmarshalJSON(data []byte) error {
    var tmp struct {
        SomeData     string          `json:"some_data"`
        DynamicField json.RawMessage `json:"dynamic_field"`
        OtherData    string          `json:"other_data"`
    }

    if err := json.Unmarshal(data, &tmp); err != nil {
        return err
    }
    b.Unmarshal(tmp.DynamicField)

    return nil
}

Unmarshal メソッドは、UnmarshalJSON 内から呼び出すことができます。動的フィールドを解析します:

func (b *BigStruct) Unmarshal(data json.RawMessage) error {
    switch UnmarshalledType(data) {
    case "A":
        var a DynamicTypeA
        if err := json.Unmarshal(data, &a); err != nil {
            return err
        }

        b.DynamicField = &a
    case "B":
        var b DynamicTypeB
        if err := json.Unmarshal(data, &b); err != nil {
            return err
        }

        b.DynamicField = &b
    }

    return nil
}

func UnmarshalledType(b json.RawMessage) string {
    var typ struct {
        Type string `json:"type"`
    }

    if err := json.Unmarshal(b, &typ); err != nil {
        log.Fatalf("Error extracting type from RawMessage: %v", err)
    }

    return typ.Type
}

このアプローチを使用すると、追加のプレースホルダー フィールドを導入せずに、動的 JSON フィールドを Go 構造体にアンマーシャリングできます。

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

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