1

多数の異なる 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パッケージを使用して、基になる型とフィールドを取得できることを考えると、これには少し驚いています。誰でもこの問題と、それを回避する方法についての洞察を提供できますか?

4

1 に答える 1