JSON を構造体とインターフェイスにアンマーシャリングする
Go では、エンコーディング/json パッケージは、JSON データと Go 値を相互に変換する機能を提供します。 。 JSON を構造体にアンマーシャリングする場合、パッケージにはターゲットの型に関する明示的な命令が必要であることを理解することが重要です。
デフォルトでは、JSON をインターフェイスにアンマーシャリングするときに、パッケージはデータ構造に基づいて適切な型を選択します。 JSON オブジェクトの場合は、map[string]interface{} が選択され、JSON 配列の場合は、[]interface{} が選択されます。ただし、構造体を扱う場合はこの動作が異なります。
JSON を特定の構造体にアンマーシャルするには、json.Unmarshal() の 2 番目のパラメーターとして構造体へのポインターを渡す必要があります。これは、Go がポインタを関数に渡すときに自動的にポインタを逆参照するためです。
ただし、JSON を非ポインタ構造体の値を含むインターフェース変数にアンマーシャリングしようとすると、パッケージには意図した構造体値を判断する方法がありません。ターゲットタイプ。代わりに、データはその構造に応じてマップまたはスライスとして解釈されます。
この問題を解決するには、ポインタ参照を使用してインターフェースで構造体の値をラップする必要があります。{}これにより、適切な型にアンマーシャルするために必要な情報が json.Unmarshal に確実に含まれるようになります。
func getFoo() interface{} { return &Foo{"bar"} // Use a pointer wrapper }
コード例の改良版を次に示します。
package main import ( "encoding/json" "fmt" ) type Foo struct { Bar string `json:"bar"` } func getFoo() interface{} { return &Foo{"bar"} } func main() { fooInterface := getFoo() myJSON := `{"bar":"This is the new value of bar"}` jsonBytes := []byte(myJSON) err := json.Unmarshal(jsonBytes, fooInterface ) if err != nil { fmt.Println(err) } fmt.Printf("%T %+v", fooInterface, fooInterface) }
この更新されたコードは正常に出力されます。更新された「bar」値を持つアンマーシャリングされた Foo 構造体。
以上がJSON アンマーシャリングに進む: 構造体とインターフェイス – ポインターを使用する場合は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。