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.