Autore Topic: Parsing json  (Letto 1440 volte)

Offline Auron

  • Utente junior
  • **
  • Post: 104
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Motorola Milestone Android 2.2.1
  • Sistema operativo:
    Windows
Parsing json
« il: 14 Luglio 2011, 12:11:47 CEST »
0
Premessa che lavoro su un DB MySQL e più precisamente:
Nome Schema: deal
Nome Tabella: myuser
Colonne di "myuser": usrname - psw
Ho editato una sola riga: user1 - psw1

Codice PHP:
Codice: [Seleziona]
<?php
$conn=mysql_connect("localhost", "admin", "password");
mysql_select_db("deal");
if (!$conn)
        {
        printf("Connessione non riuscita: %sn", mysqli_connect_error());
        exit();
        }
else
        {

               
        $sql=mysql_query("select usrname from myuser");

        while($row=mysql_fetch_assoc($sql))
                {
                $output[]=$row;
                }
        print(json_encode($output));
        mysql_close();
        }
?>

Se visualizzo il file PHP in locale (http://localhost/log.php) manualmente da browser mi restituisce ESATTAMENTE questa scrittura:

Codice: [Seleziona]
[{"usrname":"user1"}]
Ma allora com'è possibile fare funzionare questo codice che tutti usano?

Codice (Java): [Seleziona]
JSONArray array = json.getJSONArray("???????????");
                        int count = array.length();
                        for (int i = 0; i < count; i++) {
                                JSONObject obj = array.getJSONObject(i);

                                String usrname = obj.getString("usrname");
                        }

Ok che un oggetto fa parte dell'array, ma la funzione getJSONArray mi chiede il nome dell'array. Nel mio caso qual è il nome dell'array?
È stata trovata una soluzione al tuo problema?Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato ;-)

Offline 7h38ugg3r

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1200
  • Respect: +133
    • riccardofischetti
    • th38ugg3r
    • @7h38ugg3r
    • Mostra profilo
  • Dispositivo Android:
    Galaxy-S GT I-9000/ ASUS Eee Pad Transformer
  • Play Store ID:
    Riccardo Fischetti
  • Sistema operativo:
    OS X Lion / Linux Mint 11 (Katya)
Re:Parsing json
« Risposta #1 il: 14 Luglio 2011, 13:12:16 CEST »
0
l'output corretto, per un array, dovrebbe essere del tipo:

{"nomeArray": [{"usrname":"user1"}]}

7h38ugg3r<=>thebugger
Non conosci Java? Allora sei nel posto sbagliato!

http://www.androidpatterns.com/

Offline Nicola_D

  • Moderatore
  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:Parsing json
« Risposta #2 il: 14 Luglio 2011, 13:32:04 CEST »
0
te puoi anche fare il parsing del json direttamente in JSONArray:
JSONArray | Android Developers)
passagli la stringa json che ottieni dalla chiamata.
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline Auron

  • Utente junior
  • **
  • Post: 104
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Motorola Milestone Android 2.2.1
  • Sistema operativo:
    Windows
Re:Parsing json
« Risposta #3 il: 14 Luglio 2011, 14:02:57 CEST »
0
l'output corretto, per un array, dovrebbe essere del tipo:

{"nomeArray": [{"usrname":"user1"}]}



Si l'output corretto per l'array è quello, ma non ho nessun array nel mio caso,quindi come vario il codice che ho scritto se dovessi solo tenere dall'output "user1"?
È stata trovata una soluzione al tuo problema?Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato ;-)

Offline Nicola_D

  • Moderatore
  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:Parsing json
« Risposta #4 il: 14 Luglio 2011, 14:08:03 CEST »
0
Si l'output corretto per l'array è quello, ma non ho nessun array nel mio caso,quindi come vario il codice che ho scritto se dovessi solo tenere dall'output "user1"?
fai come ti ho scritto, modifichi la prima riga, il resto va bene
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline Auron

  • Utente junior
  • **
  • Post: 104
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Motorola Milestone Android 2.2.1
  • Sistema operativo:
    Windows
Re:Parsing json
« Risposta #5 il: 14 Luglio 2011, 15:03:46 CEST »
0
come mi hai detto ho fatto la modifica alla prima riga:
da: JSONArray array = json.getJSONArray(str);
a: JSONArray array = new JSONArray(str);

solo che non funziona ancora... :-(
È stata trovata una soluzione al tuo problema?Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato ;-)

Offline Auron

  • Utente junior
  • **
  • Post: 104
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Motorola Milestone Android 2.2.1
  • Sistema operativo:
    Windows
Re:Parsing json
« Risposta #6 il: 14 Luglio 2011, 20:37:07 CEST »
0
Chiedo scusa se sono ignorante...ma non sono nato con la conoscenza...e soprattutto con la facilità di apprendimento che magari qualcun altro possiede... :'(
È stata trovata una soluzione al tuo problema?Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato ;-)

Offline Luigi.Arena

  • Utente senior
  • ****
  • Post: 616
  • DACIA DUSTER 4X4 SUPER
  • Respect: +56
    • Mostra profilo
    • ArenaWebTest
  • Dispositivo Android:
    epad m009
  • Play Store ID:
    Luigi Arena
  • Sistema operativo:
    Windows 7
Re:Parsing json
« Risposta #7 il: 14 Luglio 2011, 20:41:41 CEST »
0
Dai non demoralizzarti così  o_O i migliori sono qui per aiutarti, ma in fondo è solo un software.
Coraggio!!! :-)
È stata trovata una soluzione al tuo problema?Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato .

Offline Nicola_D

  • Moderatore
  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:Parsing json
« Risposta #8 il: 14 Luglio 2011, 20:56:52 CEST »
0
Chiedo scusa se sono ignorante...ma non sono nato con la conoscenza...e soprattutto con la facilità di apprendimento che magari qualcun altro possiede... :'(
mi pare piu che altro che che ti manca la pazienza ;)
cmq non va non vuol dire niente, devi dire cosa non va e che errori da!
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline Auron

  • Utente junior
  • **
  • Post: 104
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Motorola Milestone Android 2.2.1
  • Sistema operativo:
    Windows
Re:Parsing json
« Risposta #9 il: 15 Luglio 2011, 01:29:14 CEST »
0
Se può servire l'errore nel LogCat è il seguente:

Codice: [Seleziona]
07-14 23:09:42.884: ERROR/err(337): org.json.JSONException: Value [{"psw":"psw1","usrname":"user1"}] of type org.json.JSONArray cannot be converted to JSONObject

perchè parla di conversione in JSONObject? non mi pare di farne se il codice è il seguente:

Codice (Java): [Seleziona]
//Parsing via JSON
        private void parse(JSONObject json, String s) {
                try {
                        JSONArray array = new JSONArray(s);
                        int count = array.length();
                        for (int i = 0; i < count; i++) {
                                JSONObject obj = array.getJSONObject(i);
                                String usrname = obj.getString("usrname");
                                String psw = obj.getString("psw");
                                Log.i("log_tag",usrname);
                        }
                } catch (JSONException e) {
                        Log.e(TAG, e.toString());
                }
        }

La String s che passo nella funzione di parsing è il risultato di questo:
Codice (Java): [Seleziona]
HttpClient httpclient = new DefaultHttpClient();
                        HttpPost httppost = new HttpPost("http://192.168.1.102/log.php");
                        httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
                        HttpResponse response = httpclient.execute(httppost);
                        HttpEntity entity = response.getEntity();                        
                        str = convertStreamToString(entity.getContent());
                        JSONObject json = new JSONObject(str);
                        parse(json,str);


//Conversione in Stringa
        private String convertStreamToString(InputStream is) {
                BufferedReader reader = new BufferedReader(new InputStreamReader(is),
                                8 * 1024);
                StringBuilder sb = new StringBuilder();

                String line = null;
                try {
                        while ((line = reader.readLine()) != null) {
                                sb.append(line + "\n");
                        }
                } catch (IOException e) {
                        e.printStackTrace();
                } finally {
                        try {
                                is.close();
                        } catch (IOException e) {
                                e.printStackTrace();
                        }
                }

                return sb.toString();
        }

Ripeto, il codice da browser è il seguente:
Codice: [Seleziona]
[{"usrname":"user1","psw":"psw1"}]
« Ultima modifica: 15 Luglio 2011, 01:40:59 CEST da stefanoadsl »
È stata trovata una soluzione al tuo problema?Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato ;-)

Offline Nicola_D

  • Moderatore
  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:Parsing json
« Risposta #10 il: 15 Luglio 2011, 08:28:10 CEST »
+1
beh, l'errore è piu che esplicativo!
ti dice che la stringa non può essere convertita in jsonArray. Poi se clicchi sugli errori del logcat ti porta dove l'errore è stato lanciato, o comunque, ti indica la classe e la riga in cui l'errore avviene!
scommettiamo millemila euro che l'eccezione viene lanciata alla riga in mezzo tra queste tre?
Codice (Java): [Seleziona]
str = convertStreamToString(entity.getContent());
                        JSONObject json = new JSONObject(str);
                        parse(json,str);

hai lasciato un JSONObject di troppo!
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline Auron

  • Utente junior
  • **
  • Post: 104
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Motorola Milestone Android 2.2.1
  • Sistema operativo:
    Windows
Re:Parsing json
« Risposta #11 il: 15 Luglio 2011, 11:28:54 CEST »
0

hai lasciato un JSONObject di troppo!

Eccolo l'errore! Ti ringrazio :-)
Prima di mettere Risolto a questo topic faccio un pò di test che se in caso ho ancora bisogno chiedo :-)
Grazie mille!


Ecco ho notato che pur essendo ora tutto corretto, in Console mi da quest'errore in Rosso:

Codice: [Seleziona]
[2011-07-15 11:45:02 - ddms]null
java.lang.NullPointerException
        at com.android.ddmlib.Client.sendAndConsume(Client.java:572)
        at com.android.ddmlib.HandleHello.sendHELO(HandleHello.java:142)
        at com.android.ddmlib.HandleHello.sendHelloCommands(HandleHello.java:65)
        at com.android.ddmlib.Client.getJdwpPacket(Client.java:671)
        at com.android.ddmlib.MonitorThread.processClientActivity(MonitorThread.java:317)
        at com.android.ddmlib.MonitorThread.run(MonitorThread.java:263)
« Ultima modifica: 15 Luglio 2011, 11:46:21 CEST da stefanoadsl »
È 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:Parsing json
« Risposta #12 il: 15 Luglio 2011, 12:25:57 CEST »
0
Ciao a tutti,

mi aggiungo alla richiesta precedente perchè anche io 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..

Grazie per il vostro aiuto ragazzi.
Andre

Offline 7h38ugg3r

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1200
  • Respect: +133
    • riccardofischetti
    • th38ugg3r
    • @7h38ugg3r
    • Mostra profilo
  • Dispositivo Android:
    Galaxy-S GT I-9000/ ASUS Eee Pad Transformer
  • Play Store ID:
    Riccardo Fischetti
  • Sistema operativo:
    OS X Lion / Linux Mint 11 (Katya)
Re:Parsing json
« Risposta #13 il: 15 Luglio 2011, 12:27:15 CEST »
0
Andre, è meglio che apri un nuovo topic, altrimenti si crea confusione.
7h38ugg3r<=>thebugger
Non conosci Java? Allora sei nel posto sbagliato!

http://www.androidpatterns.com/

Offline Auron

  • Utente junior
  • **
  • Post: 104
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Motorola Milestone Android 2.2.1
  • Sistema operativo:
    Windows
Re:Parsing json
« Risposta #14 il: 16 Luglio 2011, 17:08:46 CEST »
0
Ah giusto, dimenticavo...se dovessi accedere allo stesso file PHP da più client devo creare un ClientHTTP che possa essere condiviso da più App(quindi Activity), ma poi sorgerebbe il problema dei conflitti se si accede allo stesso momento allo stesso file PHP giusto?

Leggendo qua e la mi pare di aver capito che per ovviare al problema si crea un ClientHTTP che funge da ThreadSafe.

E' giusto ciò che ho detto oppure ho dato sfogo alla fantasia?
È stata trovata una soluzione al tuo problema?Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato ;-)