Convertendo JSONarray em ArrayList

104

Estou baixando uma string JSON e convertendo-a em JSONArray. Estou colocando-o em um listview e preciso ser capaz de excluí-lo mais tarde, e como JSONArray não tem nenhum método .remove (Obrigado, Obama), estou tentando convertê-lo em um arraylist.

aqui está meu JSON (array.toString ()):

[{"thumb_url":"tb-1370913834.jpg","event_id":"15","count":"44","event_tagline":"this is a tagline","event_name":"5th birthday","event_end":"1370919600","event_start":"1370876400"}]

Preciso colocá-lo em um array e ser capaz de chamar as strings por suas respectivas chaves. Agradeço qualquer ajuda!

TheGeekNess
fonte
Quando você diz chaves, isso não implica um dicionário (mapa no Android) de algum tipo? Uma matriz será baseada em índice. Dê uma olhada em developer.android.com/reference/java/util/Map.html para saber como criar e usar.
brianestey
Um mapa pode ser usado para preencher uma exibição de lista com um adaptador de base personalizado? Prefiro não usar índices no caso de o JSON mudar de ordem.
TheGeekNess
ListView obterá objetos do adaptador por índice, portanto, em qualquer caso, você precisará manter a lista em alguma ordem. Se você quiser manter a ordem das chaves (e saber quais são as chaves no momento da compilação), você pode codificar uma matriz dessas chaves na ordem que desejar e usá-la para sua ordem ao buscar no mapa.
brianestey

Respostas:

164
ArrayList<String> listdata = new ArrayList<String>();     
JSONArray jArray = (JSONArray)jsonObject; 
if (jArray != null) { 
   for (int i=0;i<jArray.length();i++){ 
    listdata.add(jArray.getString(i));
   } 
} 
Sagar Maiyad
fonte
3
E listdata.add(jArray.optJSONObject(i));se seu listdata for um JSONObject arrayList. ArrayList<JSONObject> listdata = new ArrayList<JSONObject>();
Subin Sebastian
2
Bom trecho. Caso alguém queira: há uma classe auxiliar que converte JSONObject / JSONArray em um Mapa / Lista padrão no github gist.github.com/codebutler/2339666
inexcii
2
Por que não usar um ArrayList<Object>?
natanavra
Como posso lidar com o Json Array está vazio. por favor me responda mano.
MohanRaj S
3
Existe alguma outra maneira de fazer isso sem loop?
K.Sopheak
64

Eu fiz isso usando Gson(pelo Google) .

Adicione a seguinte linha ao do seu módulo build.gradle:

dependencies {
  // ...
  // Note that `compile` will be deprecated. Use `implementation` instead.
  // See https://stackoverflow.com/a/44409111 for more info
  implementation 'com.google.code.gson:gson:2.8.2'
}

JSON corda:

private String jsonString = "[\n" +
            "        {\n" +
            "                \"id\": \"c200\",\n" +
            "                \"name\": \"Ravi Tamada\",\n" +
            "                \"email\": \"[email protected]\",\n" +
            "                \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" +
            "                \"gender\" : \"male\",\n" +
            "                \"phone\": {\n" +
            "                    \"mobile\": \"+91 0000000000\",\n" +
            "                    \"home\": \"00 000000\",\n" +
            "                    \"office\": \"00 000000\"\n" +
            "                }\n" +
            "        },\n" +
            "        {\n" +
            "                \"id\": \"c201\",\n" +
            "                \"name\": \"Johnny Depp\",\n" +
            "                \"email\": \"[email protected]\",\n" +
            "                \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" +
            "                \"gender\" : \"male\",\n" +
            "                \"phone\": {\n" +
            "                    \"mobile\": \"+91 0000000000\",\n" +
            "                    \"home\": \"00 000000\",\n" +
            "                    \"office\": \"00 000000\"\n" +
            "                }\n" +
            "        },\n" +
            "        {\n" +
            "                \"id\": \"c202\",\n" +
            "                \"name\": \"Leonardo Dicaprio\",\n" +
            "                \"email\": \"[email protected]\",\n" +
            "                \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" +
            "                \"gender\" : \"male\",\n" +
            "                \"phone\": {\n" +
            "                    \"mobile\": \"+91 0000000000\",\n" +
            "                    \"home\": \"00 000000\",\n" +
            "                    \"office\": \"00 000000\"\n" +
            "                }\n" +
            "        },\n" +
            "        {\n" +
            "                \"id\": \"c203\",\n" +
            "                \"name\": \"John Wayne\",\n" +
            "                \"email\": \"[email protected]\",\n" +
            "                \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" +
            "                \"gender\" : \"male\",\n" +
            "                \"phone\": {\n" +
            "                    \"mobile\": \"+91 0000000000\",\n" +
            "                    \"home\": \"00 000000\",\n" +
            "                    \"office\": \"00 000000\"\n" +
            "                }\n" +
            "        },\n" +
            "        {\n" +
            "                \"id\": \"c204\",\n" +
            "                \"name\": \"Angelina Jolie\",\n" +
            "                \"email\": \"[email protected]\",\n" +
            "                \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" +
            "                \"gender\" : \"female\",\n" +
            "                \"phone\": {\n" +
            "                    \"mobile\": \"+91 0000000000\",\n" +
            "                    \"home\": \"00 000000\",\n" +
            "                    \"office\": \"00 000000\"\n" +
            "                }\n" +
            "        },\n" +
            "        {\n" +
            "                \"id\": \"c205\",\n" +
            "                \"name\": \"Dido\",\n" +
            "                \"email\": \"[email protected]\",\n" +
            "                \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" +
            "                \"gender\" : \"female\",\n" +
            "                \"phone\": {\n" +
            "                    \"mobile\": \"+91 0000000000\",\n" +
            "                    \"home\": \"00 000000\",\n" +
            "                    \"office\": \"00 000000\"\n" +
            "                }\n" +
            "        },\n" +
            "        {\n" +
            "                \"id\": \"c206\",\n" +
            "                \"name\": \"Adele\",\n" +
            "                \"email\": \"[email protected]\",\n" +
            "                \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" +
            "                \"gender\" : \"female\",\n" +
            "                \"phone\": {\n" +
            "                    \"mobile\": \"+91 0000000000\",\n" +
            "                    \"home\": \"00 000000\",\n" +
            "                    \"office\": \"00 000000\"\n" +
            "                }\n" +
            "        },\n" +
            "        {\n" +
            "                \"id\": \"c207\",\n" +
            "                \"name\": \"Hugh Jackman\",\n" +
            "                \"email\": \"[email protected]\",\n" +
            "                \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" +
            "                \"gender\" : \"male\",\n" +
            "                \"phone\": {\n" +
            "                    \"mobile\": \"+91 0000000000\",\n" +
            "                    \"home\": \"00 000000\",\n" +
            "                    \"office\": \"00 000000\"\n" +
            "                }\n" +
            "        },\n" +
            "        {\n" +
            "                \"id\": \"c208\",\n" +
            "                \"name\": \"Will Smith\",\n" +
            "                \"email\": \"[email protected]\",\n" +
            "                \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" +
            "                \"gender\" : \"male\",\n" +
            "                \"phone\": {\n" +
            "                    \"mobile\": \"+91 0000000000\",\n" +
            "                    \"home\": \"00 000000\",\n" +
            "                    \"office\": \"00 000000\"\n" +
            "                }\n" +
            "        },\n" +
            "        {\n" +
            "                \"id\": \"c209\",\n" +
            "                \"name\": \"Clint Eastwood\",\n" +
            "                \"email\": \"[email protected]\",\n" +
            "                \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" +
            "                \"gender\" : \"male\",\n" +
            "                \"phone\": {\n" +
            "                    \"mobile\": \"+91 0000000000\",\n" +
            "                    \"home\": \"00 000000\",\n" +
            "                    \"office\": \"00 000000\"\n" +
            "                }\n" +
            "        },\n" +
            "        {\n" +
            "                \"id\": \"c2010\",\n" +
            "                \"name\": \"Barack Obama\",\n" +
            "                \"email\": \"[email protected]\",\n" +
            "                \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" +
            "                \"gender\" : \"male\",\n" +
            "                \"phone\": {\n" +
            "                    \"mobile\": \"+91 0000000000\",\n" +
            "                    \"home\": \"00 000000\",\n" +
            "                    \"office\": \"00 000000\"\n" +
            "                }\n" +
            "        },\n" +
            "        {\n" +
            "                \"id\": \"c2011\",\n" +
            "                \"name\": \"Kate Winslet\",\n" +
            "                \"email\": \"[email protected]\",\n" +
            "                \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" +
            "                \"gender\" : \"female\",\n" +
            "                \"phone\": {\n" +
            "                    \"mobile\": \"+91 0000000000\",\n" +
            "                    \"home\": \"00 000000\",\n" +
            "                    \"office\": \"00 000000\"\n" +
            "                }\n" +
            "        },\n" +
            "        {\n" +
            "                \"id\": \"c2012\",\n" +
            "                \"name\": \"Eminem\",\n" +
            "                \"email\": \"[email protected]\",\n" +
            "                \"address\": \"xx-xx-xxxx,x - street, x - country\",\n" +
            "                \"gender\" : \"male\",\n" +
            "                \"phone\": {\n" +
            "                    \"mobile\": \"+91 0000000000\",\n" +
            "                    \"home\": \"00 000000\",\n" +
            "                    \"office\": \"00 000000\"\n" +
            "                }\n" +
            "        }\n" +
            "    ]";

ContactModel.java:

public class ContactModel {
     public String id;
     public String name;
     public String email;
}

Código para converter uma string JSON em ArrayList<Model>:

Nota: Você deve importar java.lang.reflect.Type;:

// Top of file
import java.lang.reflect.Type;

// ...

private void parseJSON() {
    Gson gson = new Gson();
    Type type = new TypeToken<List<ContactModel>>(){}.getType();
    List<ContactModel> contactList = gson.fromJson(jsonString, type);
    for (ContactModel contact : contactList){
        Log.i("Contact Details", contact.id + "-" + contact.name + "-" + contact.email);
    }
}

Espero que isso ajude você.

Hiren Patel
fonte
4
TRÊS LINHAS ... FEITO! Acho que essa deveria ter sido a resposta aceita, pois (a) são apenas três linhas de código que funcionam perfeitamente e (b) algumas das respostas realmente executam uma tradução digitada de JSONArray para List <CustomObject>. Obrigado!
John Ward
Deve ser um JSONArray, o JSONElement parece não funcionar. então, use o getAsJsonArray()método aparentemente. Obrigado!
嘉 恒 陶
1
Exatamente o que eu precisava, obrigado! Nota: Você deve importar estes: java.lang.reflect.Type; com.google.gson.reflect.TypeToken;
Chandrani H
Incrível, essa deveria ter sido a resposta aceita !. Obrigado
Yeuni
isso não funciona dizendo que o init do typetoken está protegido
nikoss
7

tente desta forma Simplesmente percorra isso, construindo seu próprio array. Este código assume que é um array de strings, não deve ser difícil modificá-lo para se adequar à sua estrutura de array particular.

JSONArray jsonArray = new JSONArray(jsonArrayString);
List<String> list = new ArrayList<String>();
for (int i=0; i<jsonArray.length(); i++) {
    list.add( jsonArray.getString(i) );
Sunil Kumar
fonte
6

Em vez de converter a string JSON em uma ArrayList ou até mesmo em um mapa, você pode apenas criar um próprio JSONObject . Este objeto tem a capacidade de obter valores de string por chave , como você quiser, e também de remover objetos .

Para criar um a JSONObjectpartir de uma string JSON formatada corretamente, basta chamar o construtor apropriado .

JSONObject json = new JSONObject(jsonString);
brianestey
fonte
1
O problema que encontro com essa solução em particular é que, ao lidar com JSONObject e JSONArray, eles lançam JSONException. Às vezes, é útil passar o conteúdo de um JSONArray para uma função que não deveria estar ciente do JSON.
Aaron Dougherty
2
Concordo. Eu usaria o JSONObject como parte da análise do texto JSON em um objeto de modelo utilizável. Qualquer JSONException levantada indicaria um problema com o JSON de origem, o que significa que você não pode analisá-lo em um JSONArray ou JSONObject, muito menos em um objeto de modelo diferente.
brianestey de
6

Tenho solução rápida. Basta criar um arquivoArrayUtil.java

import java.util.ArrayList;
import java.util.Collection;
import org.json.JSONArray;
import org.json.JSONException;

public class ArrayUtil
{
    public static ArrayList<Object> convert(JSONArray jArr)
    {
        ArrayList<Object> list = new ArrayList<Object>();
        try {
            for (int i=0, l=jArr.length(); i<l; i++){
                 list.add(jArr.get(i));
            }
        } catch (JSONException e) {}

        return list;
    }

    public static JSONArray convert(Collection<Object> list)
    {
        return new JSONArray(list);
    }

}

Uso:

ArrayList<Object> list = ArrayUtil.convert(jArray);

ou

JSONArray jArr = ArrayUtil.convert(list);
Vasilii Suricov
fonte
O que devo fazer se precisar retornar umArrayList<String>
Acho que não é possível lançar ArrayList <Object> para ArrayList <String>
Vasilii Suricov
1
Parabéns a esta resposta. Vc resolveu meu dia! Passei 2 horas tentando consertar isso. Na verdade, meu problema era que eu queria colocar o convertido JSONArrayem uma lista para poder colocar o Listem um HashMap, então esse utilitário funcionou muito bem para mim. Obrigado @Vasilii Suricov
Jose Mhlanga
5

Em Java 8,

IntStream.range(0,jsonArray.length()).mapToObj(i->jsonArray.getString(i)).collect(Collectors.toList())
Anant Simran Singh
fonte
1
O único problema com isso é que JSONArray.getString (...) lança uma exceção que deve ser tratada dentro do mapeamento, então você acaba com o List<String> listOfStrings = IntStream.range(0, array.length()).mapToObj(i -> { try { return array.getString(i); } catch (JSONException e) { throw new AssertionFailedError("JSONArray is not a list of Strings! " + e.getMessage()); } }).collect(Collectors.toList());que não é mais tão elegante. Então, vou fazer um foreach :)
LazR
Esta é a melhor resposta aqui (imho), mas seria elegante se houvesse uma maneira de não precisar acessar a referência jsonArray mais de uma vez.
Djangofan
4
 JSONArray array = new JSONArray(json);
 List<JSONObject> list = new ArrayList();
 for (int i = 0; i < array.length();list.add(array.getJSONObject(i++)));
Classificador
fonte
2

Para torná-lo prático, use POJO.

tente assim ..

List<YourPojoObject> yourPojos = new ArrayList<YourPojoObject>();

JSONObject jsonObject = new JSONObject(jsonString);
YourPojoObject yourPojo = new YourPojoObject();
yourPojo.setId(jsonObject.getString("idName"));
...
...

yourPojos.add(yourPojo);
R9J
fonte
1

Usando Gson

    List<Student> students = new ArrayList<>();
    JSONArray jsonArray = new JSONArray(stringJsonContainArray);
    for (int i = 0; i < jsonArray.length(); i++) {
        Student student = new Gson().fromJson(jsonArray.get(i).toString(), Student.class);
        students.add(student);
    }
    return students;
kunal khedkar
fonte
1

se você deseja extrair dados do array de strings JSON, aqui está meu código de trabalho. altere o parâmetro como seus dados.


Classe PoJo

public class AllAppModel {
    private String appName;
    private String packageName;
    private int uid;
    private boolean isSelected;
    private boolean isSystemApp;
    private boolean isFav;
}

Extraia seus dados usando a linha de código abaixo

try {
    JSONArray jsonArr = new JSONArray("Your json string array");
    List<AllAppModel> lstExtrextData = new ArrayList<>();
    for (int i = 0; i < jsonArr.length(); i++) {
        JSONObject jsonObj = jsonArr.getJSONObject(i);
        AllAppModel data = new AllAppModel();
        data.setAppName(jsonObj.getString("appName"));
        data.setPackageName(jsonObj.getString("packageName"));
        data.setUid(jsonObj.getInt("uid"));
        data.setSelected(jsonObj.getBoolean("isSelected"));
        data.setSystemApp(jsonObj.getBoolean("isSystemApp"));
        data.setFav(jsonObj.getBoolean("isFav"));
        lstExtrextData.add(data);
    }
} catch (JSONException e) {
    e.printStackTrace();
}

ele retornará sua lista de objetos de classe PoJo.

Mehul Boghra
fonte
1

Estilo Java 8

   JSONArray data = jsonObject.getJSONArray("some-node");

   List<JSONObject> list = StreamSupport.stream(data.spliterator(), false)
                .map(e -> (JSONObject)e)
                .collect(Collectors.toList());
Min Hyoung Hong
fonte
0
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;
}
Ceph3us
fonte
0

Tenho solução rápida. Basta criar um arquivoArrayUtil.java

ObjectMapper mapper = new ObjectMapper(); 
List<Student> list = Arrays.asList(mapper.readValue(jsonString, Student[].class));

Uso:

ArrayList<Object> list = ArrayUtil.convert(jArray);

ou

JSONArray jArr = ArrayUtil.convert(list);
Bheem Singh
fonte
0

Variante genérica

public static <T> List<T> getList(JSONArray jsonArray) throws Exception {

    List<T> list = new ArrayList<>(jsonArray.length());

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

        list.add((T)jsonArray.get(i));
    }

    return list;

}

//Usage

List<String> listKeyString = getList(dataJsonObject.getJSONArray("keyString"));
yoAlex5
fonte
0
ArrayList<String> listdata = new ArrayList<String>();     
JSONArray jArray = (JSONArray)jsonObject; 
if (jArray != null) { 
 listdata.addAll(jArray);
}

@simplified

naveen sunkavalli
fonte
0

Apenas indo pelo assunto original do tópico:

convertendo jsonarray em lista (use jackson jsonarray e mapeador de objetos aqui):

ObjectMapper mapper = new ObjectMapper();
JSONArray array = new JSONArray();
array.put("IND");
array.put("CHN");
List<String> list = mapper.readValue(array.toString(), List.class);
Prem Abhisek
fonte
0

Uma alternativa Java 8 mais simples:

JSONArray data = new JSONArray(); //create data from this -> [{"thumb_url":"tb-1370913834.jpg","event_id":...}]

List<JSONObject> list = data.stream().map(o -> (JSONObject) o).collect(Collectors.toList());
Vivek Dhayaal
fonte