JSON をインターフェースへアンマーシャリング{}すると、さまざまなデータ型を処理できるようになります。ただし、アンマーシャリングされたインターフェースのタイプを直接アサートすることには課題が生じます。
特定のシナリオでは、インターフェースは受信メッセージからアンマーシャリングされます。{}コード スニペットに見られるように、このインターフェースでタイプの切り替えを実行しようとすると、タイプが map[string]interface{} として宣言され、予期しない結果が生成されます。
この問題を解決するには、次のことを理解することが重要です。 JSON パッケージがアンマーシャリングするデフォルトのタイプ。ドキュメント:
以降アンマーシャリングはインターフェース内で実行され、結果の型はこのセットに限定されます。{}したがって、パッケージは、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 サイトの他の関連記事を参照してください。