2012-08-29 5 views
6

私はクライアント側で、ユーザーが実行した「イベント」のリストであるjavascriptオブジェクトのリストを持っています。ユーザーが準備ができたら、これをサーバーに送信します。イベントの順序は重要なので、リストの順序を保持する必要があります。JSONポリモーフィズム

私がしたいのは、JSONライブラリをJavaコード内のいくつかのイベントオブジェクトにバインドすることです(イベントが抽象クラスで、3つの具象クラスがあります)それらはすべてEventを拡張します(EventA、EventB、EventCと言うことができます)。

理想的なシナリオでは、このような

[eventA, eventC, eventA, eventA, eventB] 

などの項目のリストを含むことが

List<Event> events = jsonlibrary.deserialise(jsonString); 

ようなものになるだろうことができ、このか、それとも私が手動でJSONツリーを検査しなければならないの、とdeserialise json配列の個々の要素は?

答えて

6

JSONオブジェクトはキーと値のペアで、型情報は含まれません。つまり、自動的にJSONオブジェクトの型を識別することはできません。あなたは、あなたが扱っているイベントの種類を見つけるために、サーバー側にいくつかのロジックを実装する必要があります。

私はJSON文字列を取るファクトリメソッドを使用することを示唆し、それは、イベントの種類を見つけるためにそれを解析し、正しいサブクラスのEventオブジェクトを構築し、それを返します。

+0

、それを使用する

https://github.com/giraudsa/serialisation

をそれは私が行っていた方法でした。型情報を推論する、または多分デシリアライザへのオブジェクトクラスのリストを渡し、私は今のあなたの方法で行くつもりです – Codemwnci

+0

から選択するクラスを与えることはほとんど反射を行うことができ、ライブラリがあった期待していました。私はクラスの数が限られているように、私は、ツリートラバーサルの限られた量と基底クラスをdeserialiseすることができます。 – Codemwnci

1

Gensonライブラリhttp://code.google.com/p/genson/を使用できます。 jsonがGensonを使用して作成された場合、具体的なタイプにデシリアライズできます。

// an example 
abstract class Event { 
String id; 
} 

class Click extends Event { 
double x, y; 
} 

// you can define aliases instead of plain class name with package (its a bit nicer and more secure) 
Genson genson = new Genson.Builder().setWithClassMetadata(true).addAlias("click", 
      Click.class).create(); 
String json = "[{\"@class\":\"click\", \"id\":\"here\", \"x\":1,\"y\":2}]"; 

// deserialize to an unknown type with a cast warning 
List<Event> events = genson.deserialize(json, List.class); 

// or better define to which generic type 
GenericType<List<Event>> eventListType = new GenericType<List<Event>>() {}; 
events = genson.deserialize(json, eventListType); 

EDITここ ウィキがされています。そうしないとあなただけの[... { "my.java.class"、 "残りのプロパティ" "@class"}]のようなものを追加する必要があります例http://code.google.com/p/genson/wiki/GettingStarted#Interface/Abstract_classes_support

1

なぜ使用しないのですかjackson json library

それはfunctionnalityデータバインディングとの完全なオブジェクト/ JSONマッパーです。

それはあなたがお楽しみいただけます、高速で小さなフットプリント、文書化し、過剰使用、および他の多くの事です!

0

Iは、JSONが同じライブラリーによってコードされている場合(JSONやXMLの)所望fonctionalityを実装ライブラリ始め: MyObject myObject = new SpecialisedObject();

String json = JsonMarshaller.ToJson(myObject); 
MyObject myClonedObject = JsonUnMarshaller(json); 
関連する問題