ホームページ > バックエンド開発 > Golang > JSON をインターフェースに安全にアンマーシャリングし、型アサーションを処理する方法{}

JSON をインターフェースに安全にアンマーシャリングし、型アサーションを処理する方法{}

Linda Hamilton
リリース: 2024-12-17 11:59:25
オリジナル
559 人が閲覧しました

How to Safely Unmarshal JSON into an Interface{} and Handle Type Assertion?

インターフェースへのアンマーシャリング{}と型アサーションの実行

JSON をインターフェースへアンマーシャリング{}すると、さまざまなデータ型を処理できるようになります。ただし、アンマーシャリングされたインターフェースのタイプを直接アサートすることには課題が生じます。

特定のシナリオでは、インターフェースは受信メッセージからアンマーシャリングされます。{}コード スニペットに見られるように、このインターフェースでタイプの切り替えを実行しようとすると、タイプが map[string]interface{} として宣言され、予期しない結果が生成されます。

この問題を解決するには、次のことを理解することが重要です。 JSON パッケージがアンマーシャリングするデフォルトのタイプ。ドキュメント:

  • bool
  • float64
  • string
  • []iインターフェース{}
  • map[string]インターフェース{}
  • nil

以降アンマーシャリングはインターフェース内で実行され、結果の型はこのセットに限定されます。{}したがって、パッケージは、Something1 や Something2 などのカスタム構造体を認識しません。

ソリューション オプション:

1。直接アンマーシャリング:

中間インターフェースの処理を回避するために、JSON データを目的の構造体タイプに直接アンマーシャリングできます。{}例:

var job Something1
json.Unmarshal([]byte(msg), &job)
ログイン後にコピー

2.汎用インターフェースから変換:

汎用インターフェースでの作業が必要な場合は、{} マップ[文字列]インターフェース{}からデータを手動で解凍できます。以下に例を示します:

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

if smth1, ok := input.(map[string]interface{}); ok {
  job := Something1{
    Thing:        smth1["thing"].(string),
    OtherThing:   smth1["other_thing"].(int64),
  }
}
ログイン後にコピー

3.ラッパー構造体:

さまざまなデータ型を処理することが一般的な場合、カスタム UnmarshalJSON メソッドを備えたラッパー構造体を使用するとプロセスを簡素化できます。このメソッドは、データをさまざまな構造体にアンマーシャルし、それに応じて Data フィールドを設定することを試みます。

以上がJSON をインターフェースに安全にアンマーシャリングし、型アサーションを処理する方法{}の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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