web-dev-qa-db-ja.com

JSONArrayからArrayList <CustomObject>に変換-Android

ArrayListをJSONArrayに変換しました。どうすれば元に戻すことができますか?

最終結果はArrayListでなければなりません。前もって感謝します。

編集:

これは、ArrayListをJSONArrayに変換する方法です。

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

以下のようにGsonライブラリを使用して、JsonArrayまたはjson文字列をArrayList<OBJECT>に変換できます

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

また、ArrayList<OBJECT>をJsonArrayに変換するときに、それを文字列に変換してJsonArrayに戻す必要はありません。

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

詳細は Gson APIドキュメント を参照してください。これがお役に立てば幸いです。

34
Purushotham

JSONArrayはオブジェクトのサブクラスにすぎないため、JSONObjectを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を使用していることを示しました。それは別の色の馬です。 JSONArrayの代わりにcom.google.gson.JsonArrayを使用する場合、Gson.fromJson()メソッドを使用してArrayListを取得できます。

ここにリンクがあります: Gson-Jsonから型指定されたArrayListに変換

3
David C Adams

残念ながら、これはあなたの側で少しの作業を必要とします。 Gsonは、任意のオブジェクトのジェネリックコレクションの逆シリアル化をサポートしていません。 Gsonユーザーガイドのトピック 任意のタイプのオブジェクトを使用したコレクションのシリアル化と非シリアル化 には、必要な操作を行うための3つのオプションがリストされています。ガイドの関連部分を引用するには:

特に何もせずにGsonでコレクションをシリアル化できます。toJson(collection)は必要な出力を書き出します。ただし、Gsonには入力を型にマップする方法を知る方法がないため、fromJson(json, Collection.class)を使用した逆シリアル化は機能しません。 Gsonでは、fromJsonにコレクション型の汎用バージョンを提供する必要があります。したがって、3つのオプションがあります。

オプション1:GsonのパーサーAPI(低レベルストリーミングパーサーまたはDOMパーサーJsonParser)を使用して配列要素を解析し、Gson.fromJson()各配列要素で。これは推奨されるアプローチです。 ここに例があります これを行う方法を示します。

オプション2Collection.classのタイプアダプターを登録して、各配列メンバーを調べ、適切なオブジェクトにマップします。このアプローチの欠点は、Gsonの他のコレクション型の逆シリアル化が台無しになることです。

オプション3MyCollectionMemberTypeのタイプアダプターを登録し、fromJsonCollection<MyCollectionMemberType>とともに使用しますこのアプローチは実用的です配列が最上位の要素として表示される場合、またはコレクションを保持するフィールドタイプをCollection<MyCollectionMemberType>タイプに変更できる場合のみ。

3つのオプションの詳細については、ドキュメントを参照してください。

1
Ted Hopp

これを試して、

ArrayList<**YOUCLASS**> **YOURARRAY** = 
new Gson().fromJson(oldJSONArray.toString(), 
new TypeToken<List<**yourClass**>>(){}.getType());
0
Ibrahem Salah

変換から始めます[JSONArray-> List <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;
}

次に、array.getJSONObject(i ++)をPOJOで置き換える汎用バージョンを作成します

例:

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;
}
0
ceph3us