ホームページ >バックエンド開発 >Golang >JSON 逆シリアル化中に「インターフェイス変換: インターフェイス {} はマップ[文字列]インターフェイス {} であり、main.Data ではありません」エラーが発生するのはなぜですか?

JSON 逆シリアル化中に「インターフェイス変換: インターフェイス {} はマップ[文字列]インターフェイス {} であり、main.Data ではありません」エラーが発生するのはなぜですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-11-14 12:33:021038ブラウズ

Why am I getting an

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 値が含まれることを期待しますが、実際のコンテンツはマップです。

解決策

この問題を解決するには、インターフェイスの性質を理解することが不可欠です。 。インターフェイスは、型が実装する必要があるメソッドのセットを定義する単なる契約です。インターフェイスを特定の型にアサートするには、インターフェイスにその型の値が事前に設定されている必要があります。

この場合、次の変更を行う必要があります。

  1. インターフェイスに設定するデータ値:
anInterface = Data{Content: "hello world", Links: []string{"link1", "link2", "link3"}}
  1. へのインターフェイスをアサートします。データ:
AData2 = anInterface.(Data)

これにより、インターフェイスをデータに変換する前に、インターフェイスに正しい型が含まれていることを確認できます。

代替アプローチ

もう 1 つのアプローチは、JSON データを目的のデータ構造に直接アンマーシャルすることです:

var AData2 Data

err := json.Unmarshal([]byte(jsonStr), &AData2)
if err != nil {
    panic(err)
}

以上がJSON 逆シリアル化中に「インターフェイス変換: インターフェイス {} はマップ[文字列]インターフェイス {} であり、main.Data ではありません」エラーが発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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