2013-04-01 38 views
1

我使用的是Gson庫,但是當它序列化JsonArray對象時,它似乎將此序列化爲對象而不是JSON數組。即序列化JsonArray作爲數組,而不是使用Gson的對象

{元素:[{名: 「值1},{名稱:」 值2" }]}?

如何從正在連載中刪除元素

+0

你直接與JsonArray工作,而不是隻使用數據綁定GSON的API,以自定義輸出,或用於數據綁定不滿足您的需求API的一些其他的缺點? (使用JsonElements比使用簡單的數據綁定API更不常見,這是Gson擅長的地方。) –

回答

1

我去看病,因爲我的腳受傷的時候我就可以走了。醫生說,「不要走就可以了。」

一般來說,像GSON的API時,一個寧可甚至不知道JsonArray存在,和他們」而是隻使用API​​的數據綁定部分,因此,而不是手動構建JsonArray,然後處理序列化它,只需提供一個Java List或數組到Gson.toJson()。例如:

List list = new ArrayList(); 
list.add("one"); 
list.add(2); 
list.add(new Foo()); 

Gson gson = new Gson(); 
String json = gson.toJson(list); 
System.out.println(json); 

如果這方式並不適合您的需求,您正在使用插着JsonArray出於某種原因,那麼你可能會被誘惑,只是調用其toString()方法,因爲,它目前創造什麼最終我不會使用它,因爲文檔中沒有任何內容表示toString()可以保證爲封閉的數組內容創建有效的JSON表示。因此,在未來的Gson版本中,它可能不會返回相同格式的String

無論如何,如果你真的想使用JsonArray,它應該按照以下順序足夠好。

JsonElement one = new JsonPrimitive("one"); 
JsonElement two = new JsonPrimitive(2); 
JsonObject foo = new JsonObject(); 
foo.addProperty("foo", new Foo().foo); 

JsonArray jsonArray = new JsonArray(); 
jsonArray.add(one); 
jsonArray.add(two); 
jsonArray.add(foo); 

System.out.println(new Gson().toJson(jsonArray)); 
// ["one",2,{"foo":"hi"}] 

注意:此答案基於Gson 2.2 API。我不記得Gson的早期版本是否包含超載的toJson(JsonElement)方法。

如果toJson方法已被用於這種方式(序列化JsonArray),但輸出如原始問題所示,請記住Java在重載方法中進行選擇時不考慮運行時類型。它綁定到編譯時類型。 (我知道。)因此,您可能需要將參數類型轉換爲JsonElement,以便讓編譯器知道綁定的方法。以下說明原始問題中可能發生的情況。

System.out.println(new Gson().toJson((Object)jsonArray)); 
// {"elements":["one",2,{"foo":"hi"}]}