JSON 逆シリアル化中のインターフェイス変換エラー
JSON から複雑なデータ構造を逆シリアル化しようとするときは、インターフェイスの適切な処理を確実に回避することが重要です。実行時エラー。次のコードを考えてみましょう:
type Data struct { Content string Links []string } func main() { anInterface := interface{}{/* JSON data here */} // Assertion to Data interface AData2 := anInterface.(Data) }
実行すると、プログラムはエラーをスローします:
panic: interface conversion: interface {} is map[string]interface {}, not main.Data
問題の理解
エラーの原因これは、文字列とインターフェイスのペアのマップを含むインターフェイスを Data 構造体に直接アサートしようとする試みから生じます。 Go はインターフェイスに Data 値が含まれることを期待しますが、実際のコンテンツはマップです。
解決策
この問題を解決するには、インターフェイスの性質を理解することが不可欠です。 。インターフェイスは、型が実装する必要があるメソッドのセットを定義する単なる契約です。インターフェイスを特定の型にアサートするには、インターフェイスにその型の値が事前に設定されている必要があります。
この場合、次の変更を行う必要があります。
anInterface = Data{Content: "hello world", Links: []string{"link1", "link2", "link3"}}
AData2 = anInterface.(Data)
これにより、インターフェイスをデータに変換する前に、インターフェイスに正しい型が含まれていることを確認できます。
代替アプローチ
もう 1 つのアプローチは、JSON データを目的のデータ構造に直接アンマーシャルすることです:
var AData2 Data err := json.Unmarshal([]byte(jsonStr), &AData2) if err != nil { panic(err) }
以上がJSON 逆シリアル化中に「インターフェイス変換: インターフェイス {} はマップ[文字列]インターフェイス {} であり、main.Data ではありません」エラーが発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。