7

一部のインターフェイスの配列を含むオブジェクトをデシリアライズしたいEntity:

type Result struct {
    Foo int;
    Bar []Entity;
};

Entityいくつかの構造体型によって実装されるインターフェイスです。JSON データは、各エンティティの「type」フィールドで構造体の型を識別します。例えば

{"type":"t1","field1":1}
{"type":"t2","field2":2,"field3":3}

Result配列に正しくデータが入力されるように型を逆シリアル化するにはどうすればよいでしょうか。私が見ることができるものから、私はしなければなりません:

  1. に実装UnmarshalJSONResultます。
  2. として解析Bar[]*json.RawMessageます。
  3. 各生メッセージを として解析しますmap[string]interface{}
  4. 生メッセージの「タイプ」フィールドを確認してください。
  5. 適切なタイプの構造体を作成します。
  6. 生のメッセージを再度解析します。今回は、作成したばかりの構造体に変換します。

これはすべて非常に退屈で退屈に聞こえます。これを行うより良い方法はありますか?それとも、私はそれを逆に行っていますか?異種オブジェクトの配列を処理するためのより標準的な方法はありますか?

4

1 に答える 1

5

あなたのプロセスはおそらく必要以上に複雑だと思います。 http://play.golang.org/p/0gahcMpuQcを参照してください。1 つの map[string]interface{} で多くのことを処理できます。

または、次のようなタイプを作成することもできます

struct EntityUnion {
    Type string
    // Fields from t1
    // Fields from t2
    // ...
}

それに非整列化します。Type 文字列を設定し、JSON データから取得できるすべてのフィールドに入力します。次に、フィールドを特定のタイプにコピーするための小さな関数が必要です。

于 2013-04-14T12:37:38.947 に答える