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 !

SteBra
fonte
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.

Spring Breaker
fonte
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;
vilpe89
fonte
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
Maxim Shoustin
fonte
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/

Kevin Bowersox
fonte
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());
nilkash
fonte
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");


}
TharakaNirmana
fonte
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!

TomCB
fonte
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

최봉재
fonte
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"},...]
Devesh Pradhan
fonte
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]);
}

}

Janus
fonte
-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);
Boyke Purnomo
fonte