ホームページ >バックエンド開発 >Golang >Go で非マーシャリングされた JSON データに対して型アサーションを実行するにはどうすればよいですか?

Go で非マーシャリングされた JSON データに対して型アサーションを実行するにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-12-25 09:28:28957ブラウズ

How to Perform Type Assertions on Unmarshaled JSON Data in Go?

非マーシャリング データを使用した型アサーション

分散システムでは、データは多くの場合 JSON 文字列として交換されます。メッセージ キューから JSON データを取得する場合、データをインターフェースに逆シリアル化し、型アサーションを実行してデータの実際の構造体の型を決定する必要があるシナリオが発生する場合があります。

問題

受信した JSON 文字列をインターフェースにアンマーシャリングし、結果を型アサートしようとすると、予期しないエラーが発生する可能性があります。{} 結果。予想される構造体タイプの代わりに、map[string]interface{} を取得します。

Solution

JSON をインターフェースにアンマーシャリングするデフォルトの動作により、タイプが得られます。{} bool、float64、string、[]interface{}、map[string]interface{} など。 Something1 と Something2 はカスタム構造体であるため、JSON アンマーシャラーによって認識されません。

これを解決するには、主に 2 つのアプローチがあります。

1.カスタム構造体への直接アンマーシャル

コード:

var input Something1
json.Unmarshal([]byte(msg), &input)
// Type assertions and processing can be performed here

var input Something2
json.Unmarshal([]byte(msg), &input)
// Type assertions and processing can be performed here

2.マップ インターフェイスから展開

コード:

var input interface{}
json.Unmarshal([]byte(msg), &input)

// Unpack the data from the map
switch v := input.(type) {
case map[string]interface{}:
    // Extract the data from the map and assign it to custom structs
}

高度なアプローチ

より汎用性の高いソリューションについては、アンマーシャリングと型アサーションを処理する「Unpacker」構造体の作成を検討してください。 process.

コード:

type Unpacker struct {
    Data       interface{}
}

func (u *Unpacker) UnmarshalJSON(b []byte) error {
    smth1 := &Something1{}
    err := json.Unmarshal(b, smth1)
    if err == nil && smth1.Thing != "" {
        u.Data = smth1
        return nil
    }

    smth2 := &Something2{}
    err = json.Unmarshal(b, smth2)
    if err != nil {
        return err
    }

    u.Data = smth2
    return nil
}

結論

これらのアプローチのいずれかを使用すると、type を正常に実行できます。最初に JSON 文字列からインターフェースにアンマーシャリングされるデータのアサーション。{}どのアプローチを選択するかは、アプリケーションの特定の要件によって異なります。

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

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