6

クライアント側にjavascriptオブジェクトのリストがあります。これは、ユーザーが実行した「イベント」のリストです。ユーザーの準備ができたら、これをサーバーに送信します。イベントの順序は重要であるため、リストの順序を維持する必要があります。

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

理想的なシナリオは次のようなものです

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

次のようなアイテムのリストが含まれている可能性があります

[eventA, eventC, eventA, eventA, eventB]

これは可能ですか、それともJSONツリーを手動で検査し、json配列の個々の要素を逆シリアル化する必要がありますか?

4

4 に答える 4

6

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

json文字列を受け取り、それを解析してイベントの種類を調べ、正しいサブクラスのEventオブジェクトを作成して、それを返すファクトリメソッドを使用することをお勧めします。

于 2012-08-29T15:30:05.087 に答える
1

Gensonライブラリhttp://code.google.com/p/genson/を使用できます。jsonがGensonを使用して生成された場合は、具象型に逆シリアル化できます。それ以外の場合は、[{"@ class": "my.java.class"、"残りのプロパティ"}...]のようなものを追加するだけで済みます。

// 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);

ここで編集 するのはwikiの例ですhttp://code.google.com/p/genson/wiki/GettingStarted#Interface/Abstract_classes_support

于 2012-08-29T16:50:56.140 に答える
1

なぜジャクソンjsonライブラリを使用しないのですか?

これは、データバインディング機能を備えた完全なオブジェクト/JSONマッパーです。

それは高速で、フットプリントが小さく、文書化され、使いすぎであり、そしてあなたが楽しむ他の多くのものです!

于 2012-08-29T16:59:03.270 に答える
0

jsonが同じライブラリによってエンコードされている場合、(jsonとxmlの)目的の機能を実装するライブラリを開始しました。

https://github.com/giraudsa/serialisation

それを使用するには、 MyObject myObject = new SpecialisedObject();

String json = JsonMarshaller.ToJson(myObject);
MyObject myClonedObject = JsonUnMarshaller(json);
于 2015-07-16T20:51:31.277 に答える