Come analizzare JSON Array (non oggetto Json) in Android


90

Ho difficoltà a trovare un modo per analizzare JSONArray. Assomiglia a questo:

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

So come analizzarlo se il JSON è stato scritto in modo diverso (in altre parole, se avessi restituito un oggetto json invece di un array di oggetti). Ma è tutto ciò che ho e devo andare con esso.

* EDIT: è un json valido. Ho creato un'app per iPhone usando questo json, ora devo farlo per Android e non riesco a capirlo. Ci sono molti esempi là fuori, ma sono tutti correlati a JSONObject. Ho bisogno di qualcosa per JSONArray.

Qualcuno può darmi qualche suggerimento, un tutorial o un esempio?

Molto apprezzato !


1
Prova questo per vedere se il tuo json è valido json.parser.online.fr
An-droid

stai usando una libreria per analizzare json? Usa la libreria gson per l'analisi json.
nilkash

È valido. L'ho analizzato in un'app che ho fatto per un iPhone e funziona. Semplicemente non so come farlo su Android
SteBra

1
@nikash, sì, ho notato che potevo usare Gson. L'unico problema è che tutti gli esempi che ho trovato riguardano l'analisi di un oggetto JSONObject non JSONArray
SteBra

Pubblica il tuo codice che hai provato finora, sarà utile dare una risposta precisa di conseguenza.
Spring Breaker

Risposte:


147

usa il frammento di codice seguente per analizzare 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");
}

Spero che sia d'aiuto.


solo una domanda se jsonarray include valori numerici come [2]. [4] e che i numeri all'interno includono di nuovo un array, quindi se voglio recuperare in particolare, diciamo l'array annidato in numeric [4] nel codice java devo scrivere int i = 4 ???
BiggDawgg

@BiggDawgg: Sono contento che ti abbia aiutato. Pubblica la tua domanda in un thread separato con i dati JSON in modo che sia facile per me rispondere.
Spring Breaker

26

Faccio solo un piccolo esempio di Jackson :

Per prima cosa crea un titolare dei dati che abbia i campi dalla stringa JSON

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

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

E analizzare l'elenco di MyDataHolders

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

Utilizzo degli elementi dell'elenco

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

Puoi farmi un esempio come posso ottenere JSON come stringa dall'URL che ho, per favore?
SteBra

1
Il DefaultHttpClientmetodo di esecuzione s è una chiamata di blocco, quindi deve essere eseguito in un'attività in background, solo per rendere chiaro il motivo per cui è in una classe separata.
vilpe89

Mi viene fornito un errore sul costruttore di HttpGetTask. "Il costruttore HttpGetTask (OnHttpGetCompletedListener) si riferisce al tipo mancante OnHttpGetCompletedListener"
SteBra

1
hai importato OnHttpGetCompletedListener? In questo modoimport your_package_name_here.HttpGetTask.OnHttpGetCompletedListener;
vilpe89

1
Sì, questo era il problema ... Grazie per aver risolto il mio problema :)
SteBra

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

Produzione:

name1
url1
name2
url2

12

Crea una classe per contenere gli oggetti.

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

Quindi deserializzare come segue:

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

Articolo di riferimento: http://blog.patrickbaumann.com/2011/11/gson-array-deserialization/


Suppongo che questo "input" sia l'URL di quel json? o è qualcos'altro?
SteBra

Questa è una soluzione molto semplice. Dovrebbe essere quello accettato a mio avviso
FabioC

6

@Stebra Vedi questo esempio. Questo potrebbe aiutarti.

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

    @SerializedName("location")
    public String location;

    public CustomerInfo()
    {}
}

E quando ottieni il risultato; analizzare in questo modo

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

1
La variabile di risultato è la tua stringa
JSONArray

La variabile di risultato sarebbe l'URL da cui ho bisogno per recuperare json o già json?
SteBra

di gran lunga la soluzione più semplice
0x6C38

6

In questo esempio ci sono diversi oggetti all'interno di un array json. Questo è,

Questo è l'array json: [{"name": "name1", "url": "url1"}, {"name": "name2", "url": "url2"}, ...]

Questo è un oggetto: {"name": "name1", "url": "url1"}

Supponendo che tu abbia ottenuto il risultato su una variabile String chiamata 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");


}

Ho difficoltà a ottenere la mia stringa JSON dall'URL. Forse potresti aiutare con quello?
SteBra

Grazie per averlo
suddiviso

3

Alcuni ottimi suggerimenti sono già stati menzionati. Usare GSON è davvero utile e per rendere la vita ancora più facile puoi provare questo sito web Si chiama jsonschema2pojo e fa esattamente questo:

Gli dai il tuo json e genera un oggetto java che può incollare nel tuo progetto. Puoi selezionare GSON per annotare le tue variabili, quindi estrarre l'oggetto dal tuo json diventa ancora più semplice!


2

Il mio caso Load From Server Example ..

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

Spero che aiuti


il tipo di ps "jsonObject.getString (" messages ")" è jsonArray; la prima risposta esistente è impossibile convertire la stringa in jsonArray; lo sto aggiustando.
최봉재

-1

Crea una classe Java POJO per gli oggetti nell'elenco in questo modo:

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

Ora crea semplicemente un elenco di NameUrlClass e inizializzalo su un ArrayList in questo modo:

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

Puoi usare store l'array JSON in questo oggetto

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

1
Non è chiaro cosa obj = JSONArray;dovrebbe fare. Cosa c'è JSONArrayin questo contesto? Da dove viene? Qual è lo scopo dell'inizializzazione objcon a new ArrayList<NameUrlClass>, quando lo sostituisci comunque subito dopo?
Max Vollmer

-3

Vecchio post lo so, ma a meno che non abbia frainteso la domanda, questo dovrebbe fare il trucco:

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);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.