Converter Json Array na lista Java normal

130

Existe uma maneira de converter JSON Array para Java Array normal para ligação de dados Android ListView?

Houston, nós temos um problema
fonte
8
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 = new ArrayList<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());
   } 
} 
Pentium10
fonte
5
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

JSONArray jsonArray = new JSONArray(jsonArrayString);

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 = new ArrayList<String>();
for (int i=0; i<jsonArray.length(); i++) {
    list.add( jsonArray.getString(i) );
}
usuario
fonte
2
Desculpe, você está certo - estou confundindo Listas com JSONArrays :) É realmente JSONArray.length ().
Nick
13

Em vez de usar a org.jsonbiblioteca incorporada, tente usar Jackson ou GSON, onde esse é um recurso único. Com Jackson, f.ex:

List<String> list = new ObjectMapper().readValue(json, List.class);
// Or for array:
String[] array = mapper.readValue(json, String[].class);
StaxMan
fonte
11

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 um JSONArrayendereço de email)

Guido Sabatini
fonte
8
Observe que você deve ter certeza absoluta de que os dados não contêm o caractere separador, caso contrário, você terminará com dados corrompidos.
Artemix
1
e o resultado tem que ser uma string.
Nicolas Tyler
Um forro, perfeito.
zeeshan
4

Use pode usar um em String[]vez de um ArrayList<String>:

Reduzirá a sobrecarga de memória que um ArrayList possui

Espero que ajude!

String[] stringsArray = new String[jsonArray.length()];
for (int i = 0; i < jsonArray.length; i++) {
    parametersArray[i] = parametersJSONArray.getString(i);
}
nurnachman
fonte
3

Usando o Java Streams, você pode apenas usar um IntStreammapeamento dos objetos:

JSONArray array = new JSONArray(jsonString);
List<String> result = IntStream.range(0, array.length())
        .mapToObj(array::get)
        .map(Object::toString)
        .collect(Collectors.toList());
Samuel Philipp
fonte
0

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

Funciona também com matriz de strings

pchot
fonte
0

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:

protected void onPostExecute(String result) {
                Log.v(TAG + " result);


                if (!result.equals("")) {

                    // Set up variables for API Call
                    ArrayList<String> list = new ArrayList<String>();

                    try {
                        JSONArray jsonArray = new JSONArray(result);

                        for (int i = 0; i < jsonArray.length(); i++) {

                            list.add(jsonArray.get(i).toString());

                        }//end for
                    } catch (JSONException e) {
                        Log.e(TAG, "onPostExecute > Try > JSONException => " + e);
                        e.printStackTrace();
                    }


                    adapter = new ArrayAdapter<String>(ListViewData.this, android.R.layout.simple_list_item_1, android.R.id.text1, list);
                    listView.setAdapter(adapter);
                    listView.setOnItemClickListener(new OnItemClickListener() {
                        @Override
                        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

                            // ListView Clicked item index
                            int itemPosition = position;

                            // ListView Clicked item value
                            String itemValue = (String) listView.getItemAtPosition(position);

                            // Show Alert
                            Toast.makeText( ListViewData.this, "Position :" + itemPosition + "  ListItem : " + itemValue, Toast.LENGTH_LONG).show();
                        }
                    });

                    adapter.notifyDataSetChanged();


                        adapter.notifyDataSetChanged();

...
Joolah
fonte
0

começando da conversão [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;
}

Em seguida, crie uma versão genérica substituindo array.getJSONObject (i ++) por POJO

exemplo:

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

Você pode usar um em String[]vez de um ArrayList<String>:

Espero que ajude!

   private String[] getStringArray(JSONArray jsonArray) throws JSONException {
            if (jsonArray != null) {
                String[] stringsArray = new String[jsonArray.length()];
                for (int i = 0; i < jsonArray.length(); i++) {
                    stringsArray[i] = jsonArray.getString(i);
                }
                return stringsArray;
            } else
                return null;
        }
Iman Marashi
fonte
0

   private String[] getStringArray(JSONArray jsonArray) throws JSONException {
            if (jsonArray != null) {
                String[] stringsArray = new String[jsonArray.length()];
                for (int i = 0; i < jsonArray.length(); i++) {
                    stringsArray[i] = jsonArray.getString(i);
                }
                return stringsArray;
            } else
                return null;
        }

user10878560
fonte
0

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("\",\"");
Mayank Yadav
fonte
-2

Eu sei que a pergunta era para Java. Mas quero compartilhar uma solução possível, Kotlinporque acho que é útil.

Com o Kotlin, você pode escrever uma função de extensão que converte a JSONArrayem uma matriz nativa (Kotlin):

fun JSONArray.asArray(): Array<Any> {
    return Array(this.length()) { this[it] }
}

Agora você pode ligar asArray()diretamente em uma JSONArrayinstância.

Johannes Barop
fonte
-3

Que tal usar o java.util.Arrays?

List<String> list = Arrays.asList((String[])jsonArray.toArray())
Michal Tsadok
fonte
15
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.
Ilinca 3/08