インターフェイス変数を使用して JSON を特定の構造体にアンマーシャリングする方法
問題:
JSON をインターフェース変数にアンマーシャリングすると、encoding/json パッケージはそれを次のように解釈します。地図。代わりに特定の構造体を使用するように指示するにはどうすればよいですか?
説明:
JSON パッケージには、アンマーシャリング時にターゲットとなる具象型が必要です。 Interface{} 変数を渡しても十分な情報は得られません。パッケージはデフォルトでオブジェクトの場合は map[string]interface{}、配列の場合は []interface{} になります。
解決策:
インターフェイス変数を使用して具体的な構造体型にアンマーシャルするように json.Unmarshal に指示する組み込みの方法はありません。ただし、回避策があります。
func getFoo() interface{} { return &Foo{"bar"} }
err := json.Unmarshal(jsonBytes, fooInterface)
fmt.Printf("%T %+v", fooInterface, fooInterface)
例:
次のコードは、テクニック:
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) // prints: *main.Foo &{Bar:This is the new value of bar} }
以上がGo でインターフェイス変数を使用して JSON を特定の構造体にアンマーシャリングする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。