1

必要な追加機能を使用してマップするラッパーを作成しています。最も重要なことのいくつかは、汎用性を維持しながらデータをマーシャリングおよびアンマーシャリングする機能です。エンコーディング/gob エンコーダーを使用してマーシャラーを作成することができましたが、マーシャリングされたデータが人間が読み取れるものであればよいので、JSON を使用して別の実装をコーディングすることにしました。

Register() を使用して実装オブジェクトのインスタンスを渡すことで、ジェネリック インターフェイス変数から適切にエンコードおよびデコードできるようになりました。(このリソースは詳細に役立ちました! http://www.funcmain.com/gob_encoding_an_interface )

ただし、JSON には Register() がありません。タイプの値があるとしましょう

type ConcreteImplementation struct {
    FieldA string
    FieldB string
}

func (c ConcreteImplementation) Key() string {
    return c.FieldA   // ConcreteImplementation implements genericValue
}

タイプの変数で

type genericValue interface {
    Key() string
}

それをマーシャリングすると、次のような JSON が出力されます。

{"FieldA":"foo","FieldB":"bar"}

そして、それをジェネリックバリュー型の変数に再びアンマーシャリングしようとすると、次のように表示されます。

パニック: インターフェースの変換: map[string]interface {} はジェネリックではありませんValue: メソッドがありません キーの編集: おっと、実際にはこうなっています!

Error with decoding! json: cannot unmarshal object into Go value of genericValue

明らかに、http: //blog.golang.org/json-and-goに記載されているようにデータをマーシャリングしようとします(「インターフェースを使用したジェネリック JSON{}」を参照)。

実装がRegister()されている場合にgobデコーダーが試行するように、データを特定の実装に適合させるにはどうすればよいですか? Register() は天の恵みであり、一般的にマーシャリングとアンマーシャリングを何もないかのように行うことができました。JSON で同じことを行うにはどうすればよいですか?

4

2 に答える 2