Autore Topic: Scorrere array JSON e inserire indici in una LISTVIEW  (Letto 5589 volte)

Offline Andre

  • Utente junior
  • **
  • Post: 62
  • Respect: +1
    • Mostra profilo
Scorrere array JSON e inserire indici in una LISTVIEW
« il: 15 Luglio 2011, 12:45:08 CEST »
0
Ciao a tutti,

ho un array JSON e vorrei passarlo ad android per poi gestirlo all'interno di una ListView.

Per controllare che l'output dello script php fosse esatto, l'ho mappato su json viewer ottenendo questo risultato:

Online JSON Viewer[/url]

Credo sia giusto no?

Ora in Android creo il mio bel client che effettua la richiesta allo script. Quindi:

Codice (Java): [Seleziona]
ArrayList<String> strings = new ArrayList<String>();
try {
                        HttpClient httpclient = new DefaultHttpClient();
                        HttpPost httppost = new HttpPost(
                                        "[url]http://labinform.altervista.org/Android/tag.php");
                        httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs2));
                        HttpResponse response = httpclient.execute(httppost);
                        HttpEntity entity = response.getEntity();
                        is = entity.getContent();
                } catch (Exception e) {
                        Log.e("log_tag", "Error in http connection " + e.toString());
                }
                try {

                        BufferedReader reader = new BufferedReader(new InputStreamReader(
                                        is, "iso-8859-1"), 8);
                        sb2 = new StringBuilder();
                        sb2.append(reader.readLine());
                        String line;
                        while ((line = reader.readLine()) != null) {
                                sb2.append(line);                              
                        }
                        is.close();
                        result2 = sb2.toString();
                        Toast.makeText(getBaseContext(), "Per comprendere il tuo livello, ecco alcune semplici domande a cui puoi rispondere: " , Toast.LENGTH_LONG).show();
                       
                }
                catch (Exception e) {
                        Log.e("log_tag", "Error in http connection " + e.toString());
                }
                //parsing data to Json
                try{
                        jArray = new JSONArray(result2);
            JSONObject json_data=null;
           
            for(int i=0;i<jArray.length();i++){
                    json_data = jArray.getJSONObject(i);
                    name=json_data.getString("domande");
                    strings.add(name);                                  
            }
                         
                }catch(JSONException e1){
                      Toast.makeText(getBaseContext(), "Nessun quiz trovato" ,
                                     Toast.LENGTH_LONG).show();
                } catch (ParseException e1) {
                      e1.printStackTrace();
                }
                       
                ls1.setAdapter(new ArrayAdapter<String>(this,
                                android.R.layout.simple_list_item_1,
                                strings));
                ls1.setTextFilterEnabled(true);
                ls1.setOnItemClickListener(new OnItemClickListener() {

                        @Override
                         public void onItemClick(AdapterView<?> a, View v, int position, long id) {
                                int x = position;
                                String valore = "";
                                if (x==0)
                          {
                                          valore = name;
                                  Intent i = new Intent();
                                  i.setClass(MainMenuActivity.this, DatabaseActivity.class);
                            i.putExtra("il dato inserito è: ", valore);
                            startActivity(i);
                                 
                          }
                          if(x==1)
                          {
                                  valore = name;
                                  Intent i = new Intent();
                                  i.setClass(MainMenuActivity.this, DatabaseActivity.class);
                            i.putExtra("il dato inserito è: ", valore);
                            startActivity(i);
                          }
                               
                        }
                        });
       
    ;
                }

Il problema è che l'app lancia una schermata vuota senza inizializzare la ListView con i valori ottenuti appunto dalla sorgente JSON. Cosa sbaglio? Credo che l'errore sia nel ciclo for dove scorro l'array JSON.. Infatti entra nel catch e mi stampa il TOAST con "nessun quiz trovato".

Tengo a precisare che per quanto riguarda l'array JSON nello script php memorizzo l'array in questo modo:

$output[] = $arraydomande[$dompos]["domande"];
echo json_encode($output);

Grazie per il vostro aiuto ragazzi.
Andre
« Ultima modifica: 15 Luglio 2011, 13:13:54 CEST da Andre »

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Scorrere array JSON e inserire indici in una LISTVIEW
« Risposta #1 il: 15 Luglio 2011, 13:36:45 CEST »
0
E' possibile debuggare con Eclipse, metti qualche breakpoint e vedi cosa succede.

Offline Andre

  • Utente junior
  • **
  • Post: 62
  • Respect: +1
    • Mostra profilo
Re:Scorrere array JSON e inserire indici in una LISTVIEW
« Risposta #2 il: 15 Luglio 2011, 13:57:21 CEST »
0
Il logcat non da alcun errore. a parte la fase di debugging,tu riesci a vedere qualcosa di errato nel codice?

Di sicuro l'errore è nel for dell'array JSON. Perchè se faccio del debugging li entra nel catch visualizzando "Nessun Quiz Trovato!".

Infatti ho provato ad inserire un toast per vedere se memorizza in una variabile l'array risultante ma non va...
« Ultima modifica: 15 Luglio 2011, 14:47:08 CEST da Andre »

Offline Andre

  • Utente junior
  • **
  • Post: 62
  • Respect: +1
    • Mostra profilo
Re:Scorrere array JSON e inserire indici in una LISTVIEW
« Risposta #3 il: 15 Luglio 2011, 16:29:20 CEST »
0
Credo che l'errore sia qui

domande=json_data.getString("domande");

In questo caso ciò che ottengo dallo script è un array quindi il metodo getString risulta inappropriato. Come posso scorrere l'array risultante e ottenere i valori contenuti in ogni campo?

Offline Auron

  • Utente junior
  • **
  • Post: 104
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Motorola Milestone Android 2.2.1
  • Sistema operativo:
    Windows
Re:Scorrere array JSON e inserire indici in una LISTVIEW
« Risposta #4 il: 15 Luglio 2011, 17:08:40 CEST »
0
Se il tuo JSON è fatto così:
{"nomearray":[{"attributo1":valore,"attributo2":"valore",ecc ecc},{..}]}
e lo vedi facendo da browser http://tuaUrl/file.php oppure se in locale http://localhost/file.php oppure http://IPcomputerLocale/file.php

penso che il codice giusto sia:

Codice (Java): [Seleziona]
try{
JSONObject json= new JSONObject(risultatoStringaConvertita);
                        JSONArray jArray = json.getJSONArray("array");
                    for(int i=0;i<jArray.length();i++){
                            JSONObject json_data = jArray.getJSONObject(i);
                            Log.i("log_tag","attributo1: "+json_data.getInt("id")); /oppure getString se è una Stringa ecc ecc..
                    }
                }

Forse è l'unica cosa che ho capito :-P fai una prova, al max ti rispondono gli esperti correggendo anche me ;-)
È stata trovata una soluzione al tuo problema?Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato ;-)

Offline Andre

  • Utente junior
  • **
  • Post: 62
  • Respect: +1
    • Mostra profilo
Re:Scorrere array JSON e inserire indici in una LISTVIEW
« Risposta #5 il: 15 Luglio 2011, 17:17:34 CEST »
0
No. Il mio output JSON è così:

["Cosa rende possibile l'utilizzo di un ciclo FOR?","La proprieta string.concat a cosa serve?","Cosa e' un array?","Nel main, cosa contiene l'array String[] args?","Cos e un array multidimensionale?","Da cosa e composto un ciclo WHILE?"]

Praticamente ho memorizzato in un array $output[] = $arraydomande[$dompos]["domande"];

poi ho richiamato la codifica JSON echo json_encode($output);

Come scritto nel primo post per vedere se l'output fosse valido, ho postato il codice sul sito jsonviewer (vedi sopra). E non sembra dare errori. Però secondo me qualcosa di errato c'è perchè entra ancora nel catch e non memorizza l'array. Tu che dici?

Offline Auron

  • Utente junior
  • **
  • Post: 104
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Motorola Milestone Android 2.2.1
  • Sistema operativo:
    Windows
Re:Scorrere array JSON e inserire indici in una LISTVIEW
« Risposta #6 il: 15 Luglio 2011, 17:59:43 CEST »
0
dico che mi sembra strano che dopo una [ ci siano subito le "
Di solito l'ordine per un jsonobject è [{"___":"___"}]
Mancherebbero le graffe...mi sembra proprio strano °_° e se effettivamente mancano le graffe allora x come son costruite le funzioni probabilmente non riesce a parsare quel codice non trovando mai le graffe.
E' una supposizione/ipotesi....non prendere alla lettera ciò che ti ho scritto anche perchè ribadisco sono un principiante
È stata trovata una soluzione al tuo problema?Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato ;-)

Offline Andre

  • Utente junior
  • **
  • Post: 62
  • Respect: +1
    • Mostra profilo
Re:Scorrere array JSON e inserire indici in una LISTVIEW
« Risposta #7 il: 15 Luglio 2011, 18:08:13 CEST »
0
Mi stavo documento su php.net e ho trovato questo:

$b = array();
echo "Empty array output as object: ", json_encode($b, JSON_FORCE_OBJECT), "\n\n";

In poche parole questa "forzatura" dovrebbe creare un JSON_OBJECT nella sintassi corretta per effettuare il parsing su android. Devo provarla. Tu l'hai mai vista?

Sostanzialmente l'output diventa questo:

Empty array output as object: {}

Dici che è corretto?

Offline Andre

  • Utente junior
  • **
  • Post: 62
  • Respect: +1
    • Mostra profilo
Re:Scorrere array JSON e inserire indici in una LISTVIEW
« Risposta #8 il: 16 Luglio 2011, 17:45:27 CEST »
0
AAA cercasi esperti :) :) nessuno di voi è in grado di aiutarmi?

Offline Andre

  • Utente junior
  • **
  • Post: 62
  • Respect: +1
    • Mostra profilo
Re:Scorrere array JSON e inserire indici in una LISTVIEW
« Risposta #9 il: 17 Luglio 2011, 11:19:13 CEST »
0


Codice (Java): [Seleziona]
try{
JSONObject json= new JSONObject(risultatoStringaConvertita);
                        JSONArray jArray = json.getJSONArray("array");
                    for(int i=0;i<jArray.length();i++){
                            JSONObject json_data = jArray.getJSONObject(i);
                            Log.i("log_tag","attributo1: "+json_data.getInt("id")); /oppure getString se è una Stringa ecc ecc..
                    }
                }

Forse è l'unica cosa che ho capito :-P fai una prova, al max ti rispondono gli esperti correggendo anche me ;-)

Ok, questo lo so. Mettiamo il caso che non abbia un int o una stringa ma un array e per ogni valore memorizzato in esso vorrei visualizzarlo. Qual'è la chiamata? json_data.get...?

Offline mimmog

  • Utente senior
  • ****
  • Post: 731
  • Respect: +11
    • MisterX_Dev
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Note e Galaxy Nexus
  • Play Store ID:
    MisterX_Dev
  • Sistema operativo:
    Windows 7
Re:Scorrere array JSON e inserire indici in una LISTVIEW
« Risposta #10 il: 19 Luglio 2011, 01:09:50 CEST »
0
Qualcuno mi sà dire come faccio ad ottenre questo ?

Codice: [Seleziona]
{
"nome_array": [
                 {"foo":"bar"},
                 {"pic":"baz"}
             ]
}

in PHP

Offline bovello

  • Nuovo arrivato
  • *
  • Post: 28
  • Respect: +2
    • Mostra profilo
    • Bovello
  • Dispositivo Android:
    San Francisco
  • Play Store ID:
    Bovello
  • Sistema operativo:
    Windows 7, Mac OS Snow Leopard
Re:Scorrere array JSON e inserire indici in una LISTVIEW
« Risposta #11 il: 19 Luglio 2011, 02:29:09 CEST »
0
per lavorare con JSON perchè non utilizzi questa libreria
 google-gson -
 
 
 A Java library to convert JSON to Java objects and vice-versa - Google Project Hosting
 


In pratica ti fa il data binding con gli oggetti java e json (e il parsing che ci sta di mezzo).
Il vantaggio è quello di lavorare con i tuoi oggetti java potendo quasi ignorare il mezzo di trasporto che c'è di mezzo.

Molto semplice da utilizzare e veloce nell'esecuzione.

Il php non lo tocco da un po', pardon ;)

Offline teskio

  • Moderatore globale
  • Utente normale
  • *****
  • Post: 387
  • Respect: +118
    • Github
    • Google+
    • Mostra profilo
    • Skullab
  • Dispositivo Android:
    Cubot GT99 / SurfTab Ventos 10.1
  • Play Store ID:
    Skullab Software
  • Sistema operativo:
    windows 7 / ubuntu 12.04
Re:Scorrere array JSON e inserire indici in una LISTVIEW
« Risposta #12 il: 19 Luglio 2011, 10:40:19 CEST »
0
Citazione da: mimmog
Qualcuno mi sà dire come faccio ad ottenre questo ?

Codice (PHP): [Seleziona]
{
"nome_array": [
                 {"foo":"bar"},
                 {"pic":"baz"}
             ]
}
in PHP


json_encode(), la stessa funzione usata da chi ha inserito questo topic. Sarebbe il caso di leggerlo il topic e attenersi ad esso invece di usarlo per le proprie domande.
return IT ;
Comunque basta dare in pasto ad Android una stringa formattata secondo lo standard JSON, anche senza usare formula empiriche strane, basta un semplice (lato server) :

Codice (PHP): [Seleziona]
echo '{value1:"sono una stringa",value2:10,value3:[{a_value1:"sono un altra stringa",a_value2:20},{b_value1:"sono un ulteriore stringa",b_value2:30}]}' ;
E poi fare il parsing lato client (Android)

P.S: con la funzione json_encode() si possono serializzare anche le classi in PHP.
« Ultima modifica: 19 Luglio 2011, 11:10:47 CEST da teskio »

Offline mimmog

  • Utente senior
  • ****
  • Post: 731
  • Respect: +11
    • MisterX_Dev
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Note e Galaxy Nexus
  • Play Store ID:
    MisterX_Dev
  • Sistema operativo:
    Windows 7
Re:Scorrere array JSON e inserire indici in una LISTVIEW
« Risposta #13 il: 19 Luglio 2011, 11:29:54 CEST »
0
per lavorare con JSON perchè non utilizzi questa libreria
 google-gson -
 
 
 A Java library to convert JSON to Java objects and vice-versa - Google Project Hosting
 


In pratica ti fa il data binding con gli oggetti java e json (e il parsing che ci sta di mezzo).
Il vantaggio è quello di lavorare con i tuoi oggetti java potendo quasi ignorare il mezzo di trasporto che c'è di mezzo.

Molto semplice da utilizzare e veloce nell'esecuzione.

Il php non lo tocco da un po', pardon ;)

Guarda utilizzo il JSON nativo tanto per quello che devo fare cioè inviare e leggere dati non mi serve niente di più, per il PHP ho risolto, non ricordo come si dichiarava un array (anche io è un pò che non lo tocco) ;)

Offline Andre

  • Utente junior
  • **
  • Post: 62
  • Respect: +1
    • Mostra profilo
Re:Scorrere array JSON e inserire indici in una LISTVIEW
« Risposta #14 il: 20 Luglio 2011, 11:11:40 CEST »
0
Ragà ma è possibile parsare 2 array json che arrivano dalla stessa pagina PHP?
ho provato a creare 2 jsonObject che indicizzo con 2 cicli for annidati. Ma non sembra funzionare...

Secondo voi, questo encode è corretto?

http://jsonviewer.stack.hu/#http://labinform.altervista.org/Android/tag.php

Se clicco su viewer non mi fa vedere i 2 array associativi e non capisco perchè...  :money_mouth: :money_mouth: :money_mouth:

Cosa ne pensate? Grazie.