Como analisar o array JSON (não o objeto Json) no Android


89

Tenho dificuldade em encontrar uma maneira de analisar JSONArray. Se parece com isso:

[{"name":"name1","url":"url1"},{"name":"name2","url":"url2"},...]

Eu sei como analisá-lo se o JSON foi escrito de forma diferente (em outras palavras, se eu tivesse o objeto json retornado em vez de uma matriz de objetos). Mas é tudo o que tenho e preciso acompanhar.

* EDIT: É um json válido. Fiz um aplicativo para iPhone usando este json, agora preciso fazer para Android e não consigo descobrir. Existem muitos exemplos por aí, mas todos eles estão relacionados a JSONObject. Preciso de algo para JSONArray.

Alguém pode me dar alguma dica, um tutorial ou um exemplo?

Muito apreciado !


1
Tente isto para ver se seu json é válido json.parser.online.fr
— An-droid

você está usando alguma biblioteca para analisar json? Use a biblioteca gson para análise json. Muito útil.
— nilkash

Isso é válido. Eu analisei em um aplicativo que fiz para um iPhone e está funcionando. Só não sei como fazer no Android
— SteBra

1
@nikash, sim, percebi que poderia usar gson. O único problema é que todos os exemplos que encontrei são para analisar um JSONObject, não JSONArray
— SteBra

Publique o código que você tentou até agora. Será útil dar uma resposta precisa em conformidade.
— Spring Breaker

Respostas:


144

use o seguinte snippet para analisar o JsonArray.

JSONArray jsonarray = new JSONArray(jsonStr);
for (int i = 0; i < jsonarray.length(); i++) {
    JSONObject jsonobject = jsonarray.getJSONObject(i);
    String name = jsonobject.getString("name");
    String url = jsonobject.getString("url");
}

Espero que ajude.


apenas uma pergunta se jsonarray incluir números como [2]. [4] e que os números dentro incluem novamente um array, portanto, se eu quiser recuperar de, especialmente, digamos que o array aninhado em numeric [4] no código java, devo escrever int i = 4 ???
— BiggDawgg

@BiggDawgg: Que bom que ajudou você. Poste sua pergunta em um thread separado com dados JSON para que seja fácil para mim responder.
— Spring Breaker

26

Vou apenas dar um pequeno exemplo de Jackson :

Primeiro crie um suporte de dados que tenha os campos da string JSON

// imports
// ...
@JsonIgnoreProperties(ignoreUnknown = true)
public class MyDataHolder {
    @JsonProperty("name")
    public String mName;

    @JsonProperty("url")
    public String mUrl;
}

E analise a lista de MyDataHolders

String jsonString = // your json
ObjectMapper mapper = new ObjectMapper();
List<MyDataHolder> list = mapper.readValue(jsonString, 
    new TypeReference<ArrayList<MyDataHolder>>() {});

Usando itens de lista

String firstName = list.get(0).mName;
String secondName = list.get(1).mName;

Você pode me dar um exemplo de como obter JSON como uma string de url que tenho, por favor?
— SteBra

1
O DefaultHttpClientmétodo execute s é uma chamada de bloqueio, portanto, deve ser feito em uma tarefa em segundo plano, apenas para deixar claro por que está em uma classe separada.
— vilpe89

Estou recebendo um erro sobre o construtor de HttpGetTask. "O construtor HttpGetTask (OnHttpGetCompletedListener) refere-se ao tipo ausente OnHttpGetCompletedListener"
— SteBra

1
você importou OnHttpGetCompletedListener? Assimimport your_package_name_here.HttpGetTask.OnHttpGetCompletedListener;
— vilpe89

1
Sim, esse era o problema ... Obrigado por resolver meu problema :)
— SteBra

19
public static void main(String[] args) throws JSONException {
    String str = "[{\"name\":\"name1\",\"url\":\"url1\"},{\"name\":\"name2\",\"url\":\"url2\"}]";

    JSONArray jsonarray = new JSONArray(str);


    for(int i=0; i<jsonarray.length(); i++){
        JSONObject obj = jsonarray.getJSONObject(i);

        String name = obj.getString("name");
        String url = obj.getString("url");

        System.out.println(name);
        System.out.println(url);
    }   
}   

Resultado:

name1
url1
name2
url2

12

Crie uma classe para conter os objetos.

public class Person{
   private String name;
   private String url;
   //Get & Set methods for each field
}

Em seguida, desserialize da seguinte forma:

Gson gson = new Gson();
Person[] person = gson.fromJson(input, Person[].class); //input is your String

Artigo de Referência: http://blog.patrickbaumann.com/2011/11/gson-array-deserialization/


Suponho que essa "entrada" seja a URL desse json? Ou é outra coisa?
— SteBra

Esta é uma solução muito simples. Deve ser o aceito a meu ver
— FábioC

6

@Stebra Veja este exemplo. Isso pode te ajudar.

public class CustomerInfo 
{   
    @SerializedName("customerid")
    public String customerid;
    @SerializedName("picture")
    public String picture;

    @SerializedName("location")
    public String location;

    public CustomerInfo()
    {}
}

E quando você obtém o resultado; analise assim

List<CustomerInfo> customers = null;
customers = (List<CustomerInfo>)gson.fromJson(result, new TypeToken<List<CustomerInfo>>() {}.getType());

1
A variável de resultado é sua String
— JSONArray

A variável de resultado seria o url que eu preciso buscar json ou json já obtido?
— SteBra

de longe a solução mais fácil
— 0x6C38

6

Neste exemplo, existem vários objetos dentro de um array json. Isso é,

Esta é a matriz json: [{"nome": "nome1", "url": "url1"}, {"nome": "nome2", "url": "url2"}, ...]

Este é um objeto: {"nome": "nome1", "url": "url1"}

Supondo que você obteve o resultado para uma variável String chamada jSonResultString:

JSONArray arr = new JSONArray(jSonResultString);

  //loop through each object
  for (int i=0; i<arr.length(); i++){

  JSONObject jsonProductObject = arr.getJSONObject(i);
  String name = jsonProductObject.getString("name");
  String url = jsonProductObject.getString("url");


}

Estou tendo dificuldade em obter meu JSONstring de URL. Talvez você possa ajudar com isso?
— SteBra

Obrigado por dividir com exemplos, boa clareza
— ryvianstyron

3

Algumas ótimas sugestões já foram mencionadas. Usar GSON é realmente muito útil, e para tornar sua vida ainda mais fácil, você pode tentar este site . Chama-se jsonschema2pojo e faz exatamente isso:

Você dá a ele seu json e ele gera um objeto java que pode ser colado em seu projeto. Você pode selecionar GSON para anotar suas variáveis, então extrair o objeto de seu json fica ainda mais fácil!


2

Meu caso, Carregar do Exemplo de Servidor ..

int jsonLength = Integer.parseInt(jsonObject.getString("number_of_messages"));
            if (jsonLength != 1) {
                for (int i = 0; i < jsonLength; i++) {
                    JSONArray jsonArray = new JSONArray(jsonObject.getString("messages"));
                    JSONObject resJson = (JSONObject) jsonArray.get(i);
                    //addItem(resJson.getString("message"), resJson.getString("name"), resJson.getString("created_at"));
                }

Espero que ajude


O tipo ps "jsonObject.getString (" messages ")" é jsonArray; a primeira resposta existente é não pode ser convertida em string para jsonArray; eu estou consertando.
— 최봉재

-1

Crie uma classe POJO Java para os objetos na lista da seguinte maneira:

class NameUrlClass{
       private String name;
       private String url;
       //Constructor
       public NameUrlClass(String name,String url){
              this.name = name;
              this.url = url; 
        }
}

Agora, basta criar uma Lista de NameUrlClass e inicializá-la em uma ArrayList assim:

List<NameUrlClass> obj = new ArrayList<NameUrlClass>;

Você pode usar armazenar a matriz JSON neste objeto

obj = JSONArray;//[{"name":"name1","url":"url1"}{"name":"name2","url":"url2"},...]

1
Não está claro o obj = JSONArray;que fazer. O que está JSONArrayneste contexto? De onde isso vem? Qual é o propósito de inicializar objcom um new ArrayList<NameUrlClass>, quando você o substitui diretamente depois de qualquer maneira?
— Max Vollmer

-3

Postagem antiga eu sei, mas a menos que eu tenha entendido mal a pergunta, isso deve funcionar:

s = '[{"name":"name1","url":"url1"},{"name":"name2","url":"url2"}]';
eval("array=" + s);
for (var i = 0; i < array.length; i++) {
for (var index in array[i]) {
    alert(array[i][index]);
}

}


-3
            URL url = new URL("your URL");
            connection = (HttpURLConnection) url.openConnection();
            connection.connect();
            InputStream stream = connection.getInputStream();
            BufferedReader reader;
            reader = new BufferedReader(new InputStreamReader(stream));
            StringBuffer buffer = new StringBuffer();
            String line = "";
            while ((line = reader.readLine()) != null) {
                buffer.append(line);
            }

            //setting the json string
            String finalJson = buffer.toString();

            //this is your string get the pattern from buffer.
            JSONArray jsonarray = new JSONArray(finalJson);
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.