Le plus drôle, c'est qu'il org.JSONArrayutilise une ArrayList sous le capot ... The arrayList where the JSONArray's properties are kept, donc la plupart des boucles se font pour rien dans de nombreux cas (juste pour l'encapsulation)
Christophe Roussy
Réponses:
186
ArrayList<String> list =newArrayList<String>();JSONArray jsonArray =(JSONArray)jsonObject;if(jsonArray !=null){int len = jsonArray.length();for(int i=0;i<len;i++){
list.add(jsonArray.get(i).toString());}}
la boucle for manque la parenthèse fermante ... a essayé de modifier mais ce n'est pas assez de caractères pour passer l'approbation. tant pis! juste un FYI.
Matt K du
itz ne manque pas en fait, le répondeur vient de coller un morceau de code avec les accolades ouvertes et fermantes de la fonction.
Sarim Javaid Khan
1
Que se passe-t-il si jsonArray.get(i)retourne null (suite à l'analyse de this :) [ "String 1", null, "String 2" ]? Votre boucle for ne planterait-elle pas alors?
dbm
Merci. Si on a sring alors JSONArray peut être créé en tant que JSONArray jsonArray = new JSONArray (yourString); le reste du code restera le même.
Kaushik Lele
Selon l'implémentation dont vous pourriez avoir besoin à la size()place de length().
Guillaume F.
57
Si vous ne disposez pas déjà d'un objet JSONArray, appelez
Ensuite, parcourez simplement cela, en construisant votre propre tableau. Ce code suppose qu'il s'agit d'un tableau de chaînes, il ne devrait pas être difficile à modifier pour s'adapter à votre structure de tableau particulière.
List<String> list =newArrayList<String>();for(int i=0; i<jsonArray.length(); i++){
list.add( jsonArray.getString(i));}
Notez que vous devez être absolument sûr que les données ne contiennent pas votre caractère de séparation, sinon vous vous retrouverez avec des données corrompues.
Artemix
1
et le résultat doit être une chaîne.
Nicolas Tyler
Une doublure, parfaite.
zeeshan
4
L'utilisation peut utiliser un String[]au lieu d'un ArrayList<String>:
Cela réduira la surcharge de mémoire d'un ArrayList
J'espère que ça aide!
String[] stringsArray =newString[jsonArray.length()];for(int i =0; i < jsonArray.length; i++){
parametersArray[i]= parametersJSONArray.getString(i);}
Je sais que cette question concerne JSONArray, mais voici l'exemple que j'ai trouvé utile où vous n'avez pas besoin d'utiliser JSONArray pour extraire des objets de JSONObject.
import org.json.simple.JSONObject;import org.json.simple.JSONValue;String jsonStr ="{\"types\":[1, 2]}";JSONObject json =(JSONObject)JSONValue.parse(jsonStr);List<Long> list =(List<Long>) json.get("types");if(list !=null){for(Long s : list){System.out.println(s);}}
nous partons de la conversion [JSONArray -> List <JSONObject>]
publicstaticList<JSONObject> getJSONObjectListFromJSONArray(JSONArray array)throwsJSONException{ArrayList<JSONObject> jsonObjects =newArrayList<>();for(int i =0;
i <(array !=null? array.length():0);
jsonObjects.add(array.getJSONObject(i++)));return jsonObjects;}
créer ensuite une version générique en remplaçant array.getJSONObject (i ++) par POJO
exemple :
public<T>staticList<T> getJSONObjectListFromJSONArray(Class<T> forClass,JSONArray array)throwsJSONException{ArrayList<Tt> tObjects =newArrayList<>();for(int i =0;
i <(array !=null? array.length():0);
tObjects.add((T) createT(forClass, array.getJSONObject(i++))));return tObjects;}privatestatic 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;}
Nous pouvons simplement convertir le JSON en chaîne lisible et le diviser en utilisant la méthode "split" de la classe String.
String jsonAsString = yourJsonArray.toString();//we need to remove the leading and the ending quotes and square brackets
jsonAsString = jsonAsString.substring(2, jsonAsString.length()-2);//split wherever the String contains ","String[] jsonAsStringArray = jsonAsString.split("\",\"");
Je ne vois pas de toArray()méthode dans la JSONArray()documentation. json.org/javadoc/org/json/JSONArray.html Cette question n'aurait probablement pas été posée s'il y avait un simple toArray().
javajavajavajavajava
1
net.sf.json.JSONArray a la méthode toArray () donc cette réponse fonctionne pour cette bibliothèque JSON. La question ne précisait pas la bibliothèque utilisée.
org.JSONArray
utilise une ArrayList sous le capot ...The arrayList where the JSONArray's properties are kept
, donc la plupart des boucles se font pour rien dans de nombreux cas (juste pour l'encapsulation)Réponses:
la source
jsonArray.get(i)
retourne null (suite à l'analyse de this :)[ "String 1", null, "String 2" ]
? Votre boucle for ne planterait-elle pas alors?size()
place delength()
.Si vous ne disposez pas déjà d'un objet JSONArray, appelez
Ensuite, parcourez simplement cela, en construisant votre propre tableau. Ce code suppose qu'il s'agit d'un tableau de chaînes, il ne devrait pas être difficile à modifier pour s'adapter à votre structure de tableau particulière.
la source
Au lieu d'utiliser une
org.json
bibliothèque intégrée, essayez d'utiliser Jackson ou GSON, où il s'agit d'une ligne unique. Avec Jackson, par exemple:la source
Ce n'est peut-être qu'une solution de contournement (pas très efficace) mais vous pouvez faire quelque chose comme ceci:
String[] resultingArray = yourJSONarray.join(",").split(",");
Évidemment, vous pouvez changer le
,
séparateur ' ' avec tout ce que vous voulez (j'avais plusieursJSONArray
adresses e-mail)la source
L'utilisation peut utiliser un
String[]
au lieu d'unArrayList<String>
:Cela réduira la surcharge de mémoire d'un ArrayList
J'espère que ça aide!
la source
En utilisant Java Streams, vous pouvez simplement utiliser un
IntStream
mappage des objets:la source
Je sais que cette question concerne JSONArray, mais voici l'exemple que j'ai trouvé utile où vous n'avez pas besoin d'utiliser JSONArray pour extraire des objets de JSONObject.
Fonctionne également avec un tableau de chaînes
la source
Voici une meilleure façon de le faire: si vous obtenez les données de l'API. Ensuite, PARSEZ le JSON et chargez-le dans votre liste:
la source
nous partons de la conversion [JSONArray -> List <JSONObject>]
créer ensuite une version générique en remplaçant array.getJSONObject (i ++) par POJO
exemple :
la source
Vous pouvez utiliser un
String[]
au lieu d'unArrayList<String>
:J'espère que ça aide!
la source
la source
Nous pouvons simplement convertir le JSON en chaîne lisible et le diviser en utilisant la méthode "split" de la classe String.
la source
Je sais que la question était pour
Java
. Mais je veux partager une solution possibleKotlin
car je pense que c'est utile.Avec Kotlin, vous pouvez écrire une fonction d'extension qui convertit a
JSONArray
en un tableau natif (Kotlin):Vous pouvez désormais appeler
asArray()
directement uneJSONArray
instance.la source
Que diriez-vous d'utiliser java.util.Arrays?
la source
toArray()
méthode dans laJSONArray()
documentation. json.org/javadoc/org/json/JSONArray.html Cette question n'aurait probablement pas été posée s'il y avait un simpletoArray()
.