必要な追加機能を使用してマップするラッパーを作成しています。最も重要なことのいくつかは、汎用性を維持しながらデータをマーシャリングおよびアンマーシャリングする機能です。エンコーディング/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 で同じことを行うにはどうすればよいですか?