2014-02-23 197 views
3

我將ArrayList轉換爲JSONArray。我怎樣才能將它轉換回來?從JSONArray轉換爲ArrayList <CustomObject> - Android

最終結果必須是ArrayList。先謝謝你。

編輯:

這是我如何ArrayList的轉換成JSONArray:

String string_object= new Gson().toJson(MyArrayList<OBJECT>); 
JSONArray myjsonarray = new JSONArray(string_object); 
+0

的什麼是陣列列表?你是如何將它轉換成JSONArray的? –

+0

我已經創建了自己的對象,並使用3個對象填充數組列表。我首先將我的數組列表轉換爲JSONArray,然後將其轉換回ArrayList。任何提示? –

+0

不知道更多關於轉換過程的信息,唯一的提示是:反轉運行轉換過程。 –

回答

12

可以使用GSON庫如下

ArrayList<OBJECT> yourArray = new Gson().fromJson(jsonString, new TypeToken<List<OBJECT>>(){}.getType()); 

//or 

ArrayList<OBJECT> yourArray = new Gson().fromJson(myjsonarray.toString(), new TypeToken<List<OBJECT>>(){}.getType()); 

而且你JsonArray或JSON字符串轉換爲ArrayList<OBJECT>轉換您ArrayList<OBJECT>到JsonArray,無需將其轉換爲字符串,並返回到JsonArray

JsonArray myjsonarray = new Gson().toJsonTree(MyArrayList<OBJECT>).getAsJsonArray(); 

詳情請參閱Gson API documentation。希望這會有所幫助。

2

JSONArray只是對象的子類,所以如果你想獲得一個JSONObjects了JSONArray到其他一些形式,JSONArray沒有任何方便的方法來完成它,所以你必須得到每個JSONObject並自己填充你的ArrayList。

這裏有一個簡單的方法來做到這一點:

ArrayList<JSONObject> arrayList = new ArrayList(myJSONArray.length()); 
for(int i=0;i < myJSONArray.length();i++){ 
    arrayList.add(myJSONArray.getJSONObject(i)); 
} 

編輯:

OK,你編輯你的代碼,以顯示您正在使用GSON。那是一匹不同顏色的馬。如果您使用com.google.gson.JsonArray而不是JSONArray,則可以使用Gson.fromJson()方法來獲取ArrayList。

這裏是一個鏈接:Gson - convert from Json to a typed ArrayList

+0

這不是我要找的。如果你能幫助我,我已經編輯了這個問題。 –

+1

令人沮喪的事實是'JSONArray'已經在裏面使用'ArrayList',但那個是私有的。 – luckydonald

1

不幸的是,這將需要你一點點的工作。 Gson不支持反序列化任意對象的泛型集合。 Gson用戶指南主題Serializing and Deserializing Collection with Objects of Arbitrary Types列出了三個選項,用於執行您想要的操作。引述手冊中的相關部分:

可以序列與GSON收集而不做具體的事情:toJson(collection)會寫出所需的輸出。 但是,由於Gson無法知道如何將輸入映射到類型,因此使用fromJson(json, Collection.class)進行反序列化將不起作用。 Gson要求您在fromJson中提供通用版本的集合類型。所以,你有三種選擇:

選項1:使用GSON的解析器API(低電平流解析器或DOM解析器JsonParser)來解析數組元素,然後在每個數組元素的使用Gson.fromJson()。這是首選的方法。演示如何做到這一點的Here is an example

選項2:註冊一個類型爲Collection.class的適配器,它查看每個數組成員並將它們映射到適當的對象。這種方法的缺點是它會在Gson中搞亂其他集合類型的反序列化。

選項3:註冊一個類型的適配器MyCollectionMemberType和使用fromJsonCollection<MyCollectionMemberType> 這種方法是可行的只有當陣列顯示爲頂級元素,或者如果你可以改變字段類型抱着收藏的是鍵入Collection<MyCollectionMemberType>

有關三個選項中的每一個的詳細信息,請參閱文檔。

0

我們從轉換開始[JSONArray - >列表<的JSONObject>]

public static List<JSONObject> getJSONObjectListFromJSONArray(JSONArray array) 
     throws JSONException { 
    ArrayList<JSONObject> jsonObjects = new ArrayList<>(); 
    for (int i = 0; 
      i < (array != null ? array.length() : 0);   
      jsonObjects.add(array.getJSONObject(i++)) 
     ); 
    return jsonObjects; 
} 

下創建通用版本與POJO

例如更換array.getJSONObject(I ++):

public <T> static List<T> getJSONObjectListFromJSONArray(Class<T> forClass, JSONArray array) 
     throws JSONException { 
    ArrayList<Tt> tObjects = new ArrayList<>(); 
    for (int i = 0; 
      i < (array != null ? array.length() : 0);   
      tObjects.add((T) createT(forClass, array.getJSONObject(i++))) 
     ); 
    return tObjects; 
} 

private static T createT(Class<T> forCLass, JSONObject jObject) { 
    // instantiate via reflection/use constructor or whatsoever 
    T tObject = forClass.newInstance(); 
    // if not using constuctor args fill up 
    // 
    // return new pojo filled object 
    return tObject; 
} 
相關問題