[英]How to Unmarshal JSON into an interface in Go
我試圖同時解組和剝離來自許多不同的JSON響應的字段到適當的Go結構。 為此,我創建了一個Wrappable接口,該接口定義Unwrap方法(剝離相應的字段),並將該接口傳遞給解組和解包的代碼。 看起來像以下示例(也位於http://play.golang.org/p/fUGveHwiz9 ):
package main
import (
"encoding/json"
"fmt"
)
type Data struct {
A string `json:"a"`
B string `json:"b"`
}
type DataWrapper struct {
Elements []Data `json:"elems"`
}
type Wrapper interface {
Unwrap() []interface{}
}
func (dw DataWrapper) Unwrap() []interface{} {
result := make([]interface{}, len(dw.Elements))
for i := range dw.Elements {
result[i] = dw.Elements[i]
}
return result
}
func unmarshalAndUnwrap(data []byte, wrapper Wrapper) []interface{} {
err := json.Unmarshal(data, &wrapper)
if err != nil {
panic(err)
}
return wrapper.Unwrap()
}
func main() {
data := `{"elems": [{"a": "data", "b": "data"}, {"a": "data", "b": "data"}]}`
res := unmarshalAndUnwrap([]byte(data), DataWrapper{})
fmt.Println(res)
}
但是,當我運行代碼時,出現以下錯誤導致出現緊急情況:
panic: json: cannot unmarshal object into Go value of type main.Wrapper
似乎解組器不想傳遞給接口的指針。 鑒於我可以使用unmarshalAndUnwrap方法中的reflect包了解底層類型和字段,因此對此我感到有些驚訝。 誰能提供對此問題的見解以及我如何解決該問題?
如您所述,傳遞非指針失敗。 您為何仍要嘗試這樣做?
更換
res := unmarshalAndUnwrap([]byte(data), DataWrapper{})
通過
res := unmarshalAndUnwrap([]byte(data), &DataWrapper{})
它可以解決問題,避免不必要的復制。
此錯誤應該可以幫助您了解: http : //play.golang.org/p/jXxCxPQDOw
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.