多数の異なる JSON 応答から適切な Go 構造体にフィールドを同時にアンマーシャリングして削除しようとしています。これを行うために、Unwrap メソッド (適切なフィールドを取り除く) を定義する Wrappable インターフェイスを作成し、そのインターフェイスをアンマーシャリングおよびアンラップするコードに渡します。次の例のようになります (これも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)
}
ただし、コードを実行すると、Go は次のエラーでパニックになります。
panic: json: cannot unmarshal object into Go value of type main.Wrapper
アンマーシャラーは、インターフェイスへのポインターを渡されたくないようです。unmarshalAndUnwrap メソッド内でreflectパッケージを使用して、基になる型とフィールドを取得できることを考えると、これには少し驚いています。誰でもこの問題と、それを回避する方法についての洞察を提供できますか?