web-dev-qa-db-fra.com

Convertir de JSONArray à ArrayList <CustomObject> - Android

J'ai converti un ArrayList à un JSONArray. Comment puis-je le reconvertir?

Le résultat final doit être une ArrayList. Merci d'avance.

MODIFIER:

Voici comment je convertis le ArrayList en JSONArray:

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

Vous pouvez convertir votre chaîne JsonArray ou json en ArrayList<OBJECT> en utilisant la bibliothèque Gson comme ci-dessous.

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

De même, lors de la conversion de votre ArrayList<OBJECT> en JsonArray, nul besoin de la convertir en chaîne, puis de nouveau en JsonArray

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

Reportez-vous à Documentation de l'API Gson pour plus de détails. J'espère que cela vous sera utile.

25
Uttam

JSONArray est juste une sous-classe d'objet, donc si vous souhaitez extraire les objets JSON d'un objet JSONArray, JSONArray n'a aucun moyen pratique de le faire. Vous devez donc obtenir chaque objet JSON et remplir votre liste ArrayList vous-même.

Voici un moyen simple de le faire:

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

MODIFIER:

OK, vous avez édité votre code pour montrer que vous utilisez GSON. C'est un cheval d'une couleur différente. Si vous utilisez com.google.gson.JsonArray au lieu de JSONArray, vous pouvez utiliser la méthode Gson.fromJson () pour obtenir un ArrayList.

Voici un lien: Gson - convertir de Json en une ArrayList typée

3
David C Adams

Malheureusement, cela nécessitera un peu de travail de votre part. Gson ne prend pas en charge la désérialisation des collections génériques d’objets arbitraires. La rubrique Sérialisation et désérialisation de la collection avec des objets de types arbitraires dans le guide d'utilisation Gson répertorie trois options permettant de réaliser les tâches qui vous intéressent. Pour citer les parties pertinentes du guide:

Vous pouvez sérialiser la collection avec Gson sans rien faire de spécifique: toJson(collection) écrira la sortie souhaitée. Cependant, la désérialisation avec fromJson(json, Collection.class) ne fonctionnera pas, car Gson ne sait pas comment mapper l'entrée aux types. Gson nécessite que vous fournissiez une version généralisée du type de collection dans fromJson. Donc, vous avez trois options:

Option 1 : Utilisez l'API d'analyse syntaxique de Gson (analyseur de flux continu de bas niveau ou l'analyseur syntaxique DOM JsonParser) pour analyser les éléments du tableau, puis utilisez Gson.fromJson() sur chacun des éléments du tableau. C'est l'approche privilégiée. Voici un exemple qui montre comment faire cela.

Option 2 : Enregistrez un adaptateur de type pour Collection.class qui examine chacun des membres du tableau et les mappe aux objets appropriés. L'inconvénient de cette approche est qu'elle va gâcher la désérialisation d'autres types de collection dans Gson.

Option 3 : Enregistrez un adaptateur de type pour MyCollectionMemberType et utilisez fromJson avec Collection<MyCollectionMemberType> Cette approche est pratique uniquement si le tableau apparaît en tant qu'élément de niveau supérieur ou si vous pouvez modifier le type de champ contenant le la collection doit être de type Collection<MyCollectionMemberType>.

Voir la documentation pour plus de détails sur chacune des trois options.

1
Ted Hopp

on commence à partir de la conversion [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;
}

next crée une version générique remplaçant array.getJSONObject (i ++) par POJO

exemple :

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