2012-08-29 55 views
6

我有我的客戶端上的javascript對象列表,這是用戶執行的「事件」列表。當用戶準備就緒時,我想將其發送到服務器。事件的順序很重要,所以保留列表順序是必要的。JSON多態性

我想要做的是有一個JSON庫(不介意哪一個)將JSON綁定到我的Java代碼中的某些Event對象,其中Event是一個抽象類,並且我有3個具體類都可以擴展Event(可以說EventA,EventB和EventC)。

理想的情況會是這樣的

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

可以包含項目的列表,如

[eventA, eventC, eventA, eventA, eventB] 

這是可能的,還是我不得不手動檢查JSON樹,deserialise json數組的單個元素?

回答

6

JSON對象僅僅鍵/值對和不包含類型信息。這意味着自動識別JSON對象的類型是不可能的。你必須在服務器端實現一些邏輯來找出你正在處理的事件。

我會建議使用一個工廠方法這需要一個JSON字符串,分析它,找出它是什麼樣的事件,建立正確的子類的事件對象,並返回它。

+0

這就是我要走的路。希望有一個庫可以做一些反思來推斷類型信息,或者將對象類的列表傳遞給反序列化程序,以便讓類從 – Codemwnci

+0

中進行選擇。現在我將使用您的方法。由於我只有有限數量的類,因此可以使用有限的樹遍歷來反序列化基類。 – Codemwnci

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

編輯 這裏是維基例如http://code.google.com/p/genson/wiki/GettingStarted#Interface/Abstract_classes_support

1

爲什麼不使用jackson json library

它是一個完整的對象/ JSON映射器,數據綁定functionnality。

它速度快,佔用資源少,證明,過度使用,和許多其他的東西,你會喜歡!

0

我開始了實現所期望的fonctionality(對於JSON和XML)如果JSON是由相同的文庫編碼庫:

https://github.com/giraudsa/serialisation

使用它, MyObject myObject = new SpecialisedObject();

String json = JsonMarshaller.ToJson(myObject); 
MyObject myClonedObject = JsonUnMarshaller(json);