Golang の開発プロセスでは、データ交換とシリアル化に JSON を使用することがよくあります。ただし、JSON データを構造体に逆シリアル化しようとすると、「アンマーシャリングできません...」エラーが発生することがあります。このエラー メッセージは不可解で、理解するのが難しく、混乱を招きます。この記事は、このエラーの原因を理解し、いくつかの解決策を提供するのに役立ちます。
解決策 1: 構造体のメンバー変数の型を確認する
「アンマーシャルできません...」エラーは、通常、JSON 文字列の値と構造体のメンバー変数の型の不一致によって発生します。構造体のメンバ変数です。このエラーを回避するには、構造体を宣言するときに、各メンバー変数の型が JSON 内の対応する値と一致することを確認する必要があります。
たとえば、次の構造を定義します:
type Person struct { Name string Age int }
次の JSON を構造に逆シリアル化しようとすると、「アンマーシャルできません...」エラーが発生します:
{ "Name": "Lucy", "Age": "28" }
これは、JSON の Age 値の型が文字列であり、構造内の Age メンバー変数の型 int と一致できないためです。 JSON データを正しく逆シリアル化するには、Age のタイプを文字列として定義する必要があります。
解決策2:構造体のメンバ変数のタグを確認する
通常、構造体のメンバ変数にフィールドのタグ(タグ)を定義しておけば、そのタグの情報が反映されます。シリアル化中に JSON データをガイドし、各フィールドの名前とその他の詳細を識別します。そのため、JSONをデシリアライズする際に、タグ情報がJSONデータの属性名と一致しない場合にも、このエラーが発生する可能性があります。
たとえば、次の構造を定義します:
type Person struct { Name string `json:"PersonName"` Age int `json:"PersonAge"` }
次の JSON を構造に逆シリアル化しようとすると、「アンマーシャルできません...」エラーも発生します:
{ "Name": "Lucy", "Age": 28 }
これは、構造内の Name フィールドと Age フィールドにラベルを定義しており、ラベルに定義されているフィールド名が JSON データの属性名と一致していないためです。したがって、正しく逆シリアル化するには、JSON データの属性名を構造内で定義されたタグ名に変更する必要があります。
解決策 3: アノテーションに golang 独自の json パッケージを使用する
もう 1 つの方法は、golang 独自の json パッケージを使用して、アノテーションによる「アンマーシャルできません…」エラーを防ぐことです。この方法では、以下に示すように、構造を定義するときに各フィールドに json タグを追加する必要があります。
type Person struct { Name string `json:"name"` Age int `json:"age"` }
JSON を逆シリアル化するときは、コード内で json.Unmarshal メソッドを使用し、JSON データを入力として追加する必要があります。このようにして、JSON データを正しく逆シリアル化できます。次に例を示します。
p := &Person{} jsonData := []byte(`{"name":"John","age":18}`) err := json.Unmarshal(jsonData, p) if err != nil { fmt.Println("Unmarshal error: ", err) } fmt.Printf("Name: %s, Age: %d", p.Name, p.Age)
まとめ
ほとんどの場合、「アンマーシャリングできません...」エラーは、通常、次のタイプと構造が原因です。 JSONデータ 本体のメンバー変数の型の不一致、またはJSONデータ内のタグ情報と属性名の不一致が原因で発生します。これらの問題を注意深く確認することで、このエラーを回避できます。このエラーをより適切に解決したい場合は、注釈管理に Golang 独自の json パッケージを使用してください。
以上がGolang で「アンマーシャリングできません...」エラーを解決するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。