O engraçado é que org.JSONArrayusa um ArrayList sob o capô ... The arrayList where the JSONArray's properties are kept, então a maioria looping é feito para nada, em muitos casos (apenas para o encapsulamento)
Christophe Roussy
Respostas:
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());}}
O loop for está ausente nos parênteses de fechamento ... tentei editar, mas não há caracteres suficientes para passar na aprovação. Ah bem! apenas um FYI.
Matt K
Na verdade, não faltando, o respondente acabou de colar um pedaço de código com as chaves de abertura e fechamento da função.
Sarim Javaid Khan
1
O que acontece se jsonArray.get(i)retorna nulo (como resultado da análise:) [ "String 1", null, "String 2" ]? Seu crash for-loop não seria então?
DBM
Obrigado. Se alguém tiver sring, o JSONArray poderá ser criado como JSONArray jsonArray = new JSONArray (yourString); o restante do código permanecerá o mesmo.
precisa saber é o seguinte
Dependendo da implementação, você pode precisar em size()vez de length().
Guillaume F.
57
Se você ainda não possui um objeto JSONArray, chame
Em seguida, basta percorrer isso, criando sua própria matriz. Esse código assume que é uma matriz de seqüências de caracteres, não deve ser difícil de modificar para se adequar à sua estrutura de matriz específica.
List<String> list =newArrayList<String>();for(int i=0; i<jsonArray.length(); i++){
list.add( jsonArray.getString(i));}
Eu sei que essa pergunta é sobre JSONArray, mas aqui está um exemplo que eu achei útil onde você não precisa usar o JSONArray para extrair objetos do 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);}}
começando da conversão [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;}
Em seguida, crie uma versão genérica substituindo array.getJSONObject (i ++) por POJO
exemplo:
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;}
Podemos simplesmente converter o JSON em string legível e dividi-lo usando o método "split" da 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("\",\"");
Não vejo um toArray()método nos JSONArray()documentos. json.org/javadoc/org/json/JSONArray.html Esta pergunta provavelmente não teria sido feita se houvesse uma simples toArray().
Javajavajavajavajava
1
net.sf.json.JSONArray possui o método toArray (), portanto, essa resposta funciona para esta biblioteca JSON. A pergunta não especificou a biblioteca usada.
org.JSONArray
usa um ArrayList sob o capô ...The arrayList where the JSONArray's properties are kept
, então a maioria looping é feito para nada, em muitos casos (apenas para o encapsulamento)Respostas:
fonte
jsonArray.get(i)
retorna nulo (como resultado da análise:)[ "String 1", null, "String 2" ]
? Seu crash for-loop não seria então?size()
vez delength()
.Se você ainda não possui um objeto JSONArray, chame
Em seguida, basta percorrer isso, criando sua própria matriz. Esse código assume que é uma matriz de seqüências de caracteres, não deve ser difícil de modificar para se adequar à sua estrutura de matriz específica.
fonte
Em vez de usar a
org.json
biblioteca incorporada, tente usar Jackson ou GSON, onde esse é um recurso único. Com Jackson, f.ex:fonte
Talvez seja apenas uma solução alternativa (não muito eficiente), mas você poderia fazer algo assim:
String[] resultingArray = yourJSONarray.join(",").split(",");
Obviamente, você pode alterar o
,
separador ' ' com o que quiser (eu tinha umJSONArray
endereço de email)fonte
Use pode usar um em
String[]
vez de umArrayList<String>
:Reduzirá a sobrecarga de memória que um ArrayList possui
Espero que ajude!
fonte
Usando o Java Streams, você pode apenas usar um
IntStream
mapeamento dos objetos:fonte
Eu sei que essa pergunta é sobre JSONArray, mas aqui está um exemplo que eu achei útil onde você não precisa usar o JSONArray para extrair objetos do JSONObject.
Funciona também com matriz de strings
fonte
Aqui está uma maneira melhor de fazer isso: se você estiver obtendo os dados da API. PARSE o JSON e carregue-o na sua lista:
fonte
começando da conversão [JSONArray -> List <JSONObject>]
Em seguida, crie uma versão genérica substituindo array.getJSONObject (i ++) por POJO
exemplo:
fonte
Você pode usar um em
String[]
vez de umArrayList<String>
:Espero que ajude!
fonte
fonte
Podemos simplesmente converter o JSON em string legível e dividi-lo usando o método "split" da classe String.
fonte
Eu sei que a pergunta era para
Java
. Mas quero compartilhar uma solução possível,Kotlin
porque acho que é útil.Com o Kotlin, você pode escrever uma função de extensão que converte a
JSONArray
em uma matriz nativa (Kotlin):Agora você pode ligar
asArray()
diretamente em umaJSONArray
instância.fonte
Que tal usar o java.util.Arrays?
fonte
toArray()
método nosJSONArray()
documentos. json.org/javadoc/org/json/JSONArray.html Esta pergunta provavelmente não teria sido feita se houvesse uma simplestoArray()
.