Autore Topic: Parsing JSON va solo quando vuole lui  (Letto 1419 volte)

Offline Vittorio

  • Nuovo arrivato
  • *
  • Post: 21
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    sony xperia p
  • Play Store ID:
    Vittorio Calligaris
  • Sistema operativo:
    windows 7 / Ubuntu 12.10
Parsing JSON va solo quando vuole lui
« il: 07 Novembre 2013, 18:22:59 CET »
0
Ciao, sto sviluppando un'applicazione che scarica dei dati tramite json, l'ho sempre testata sul simulatore ed è sempre funzionata correttamente, ma quando ho provato a farla girare sul mio telefono ho ricevuto il seguente errore:

org.json.JSONException: end of input at character 0 of
 
la cosa che mi da più fastidio però è che ogni tanto (circa una volta su 4) funziona correttamente.

Il parsing lo faccio con questo codice:

Codice (Java): [Seleziona]
try{
                    JSONArray jArray = new JSONArray(result);
                   
                       
                   
                 
                                int i=idEvento;
                               
                                         
                            JSONObject json_data = jArray.getJSONObject(i);
                            Log.i("TEST","id: "+json_data.getInt("id")+
                                    ", eventname: "+json_data.getString("eventname")+
                                    ", eventdesc: "+json_data.getString("eventdesc")
                            );
                           
                            String place=json_data.getString("place");
                            nomeEvento.setText(json_data.getString("eventname"));
                            descrizioneEvento.setText(json_data.getString("eventdesc"));
                            luogoEvento.setText(place);
                            dataEvento.setText(json_data.getString("date"));
                            prezziEvento.setText(json_data.getString("prices"));
                       
                           
                           
                   
            }
            catch(JSONException e)
            {
                    Log.e("log_tag", "Error parsing data "+e.toString());
            }

ho provato anche a cambiare dispositivo, ma nulla, sui telefoni reali va solo quando vuole lui

Help

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Parsing JSON va solo quando vuole lui
« Risposta #1 il: 07 Novembre 2013, 18:27:32 CET »
0
Per capire dove nasce l'errore di preciso e quale può essere la causa, devi postare tutto il LogCat dell'errore.
Inoltre se sei in grado di intepretarlo, individua la riga di codice dove si verifica l'errore ed indicala nel codice che hai postato.

Poi vediamo di ragionare su come risolverlo.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline Vittorio

  • Nuovo arrivato
  • *
  • Post: 21
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    sony xperia p
  • Play Store ID:
    Vittorio Calligaris
  • Sistema operativo:
    windows 7 / Ubuntu 12.10
Re:Parsing JSON va solo quando vuole lui
« Risposta #2 il: 07 Novembre 2013, 18:42:39 CET »
0
Il fatto è che non ho un logCat perché l'errore si verifica solo sul telefono e non sul simulatore,
per leggere l'eccezione ho fatto:
descrizione.setText(e.toString());

è un metodo un po ignorante ma ho ottenuto:

org.json.JSONException: end of input at character 0 of

e nientaltro

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Parsing JSON va solo quando vuole lui
« Risposta #3 il: 07 Novembre 2013, 19:05:03 CET »
0
Il fatto è che non ho un logCat perché l'errore si verifica solo sul telefono e non sul simulatore,
per leggere l'eccezione ho fatto:
descrizione.setText(e.toString());

è un metodo un po ignorante ma ho ottenuto:

org.json.JSONException: end of input at character 0 of

e nientaltro

Ok, allora è un po' in salita.

A occhio l'errore esce perchè result è null o vuoto. Comincerei con il commentare le righe che fanno il parsing, e farei uscire sulla textview il contenuto di result, però controllando che non sia null. Una cosa di questo genere:

Codice (Java): [Seleziona]
if (result==null) descrizione.setText("result è NULL");
else descrizione.setText(result);

NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline Vittorio

  • Nuovo arrivato
  • *
  • Post: 21
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    sony xperia p
  • Play Store ID:
    Vittorio Calligaris
  • Sistema operativo:
    windows 7 / Ubuntu 12.10
Re:Parsing JSON va solo quando vuole lui
« Risposta #4 il: 07 Novembre 2013, 19:15:44 CET »
0
ok, Sul simulatore mi scrive il contenuto di tutto il json in un unica stringa, come è giusto che sia, adesso provo sul telefono

Post unito: 07 Novembre 2013, 19:31:35 CET
Avevi ragione, ma result non è null (non entriamo nell'if), ma semplicemente vuoto...

Adesso l'imputato è il codice immediatamente precedente:

Codice (Java): [Seleziona]
if(is != null)
        {
            //converto la risposta in stringa
            try
            {
                    BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8);
                    StringBuilder sb = new StringBuilder();
                    String line = null;
                    while ((line = reader.readLine()) != null)
                    {
                            sb.append(line + "\n");
                    }
                    is.close();
 
                    result=sb.toString();
            }catch(Exception e){
                    Log.e("TEST", "Errore nel convertire il risultato "+e.toString());
                    descrizione.setText(e.toString());
            }

che però non da nessuna eccezione
« Ultima modifica: 07 Novembre 2013, 19:31:35 CET da Vittorio, Reason: Merged DoublePost »

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Parsing JSON va solo quando vuole lui
« Risposta #5 il: 07 Novembre 2013, 19:37:23 CET »
0
Come ti dicevo, tocca risalire la cima.  :-P

Hai già escluso che is non sia null ? In tal caso non entra nell'if e presumo result rimanga nullo.

Puoi provare facilmente sul telefono con un costrutto di quest tipo:

Codice (Java): [Seleziona]
if(is != null)  {   //codice che hai postato sopra }
else  { result = "risultato scritto a mano da te per essere facilmente riconoscibile"; }
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline Vittorio

  • Nuovo arrivato
  • *
  • Post: 21
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    sony xperia p
  • Play Store ID:
    Vittorio Calligaris
  • Sistema operativo:
    windows 7 / Ubuntu 12.10
Re:Parsing JSON va solo quando vuole lui
« Risposta #6 il: 07 Novembre 2013, 19:38:36 CET »
0
Comunque non dimentichiamoci che sul simulatore funziona, e sul telefono solo qualche volta

Post unito: 07 Novembre 2013, 19:40:26 CET
Si, avevo gia fatto, mi ero solo dimenticato di copiarlo :
 else
        {//is è null e non ho avuto risposta
           alert("Errore nella connessione");      //una mia funzione che fa un toast     
        }

e non succede niente,
Quindi non è null
« Ultima modifica: 07 Novembre 2013, 19:42:49 CET da Vittorio »

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Parsing JSON va solo quando vuole lui
« Risposta #7 il: 07 Novembre 2013, 19:58:58 CET »
0
Comunque non dimentichiamoci che sul simulatore funziona, e sul telefono solo qualche volta

Non lo dimentico, ma visto che l'errore non è evidente, bisogna verificare anche l'ovvio.

Comunque pare entri con certezza dentro quell'if. Prova a vedere se entra almeno una volta dentro il while, così dovrebbe andare:

Codice (Java): [Seleziona]
if (line==null) alert("line è null");
result=sb.toString();
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline Melanogaster

  • Utente normale
  • ***
  • Post: 260
  • Respect: +11
    • Mostra profilo
  • Dispositivo Android:
    SII
  • Sistema operativo:
    Kubuntu
Re:Parsing JSON va solo quando vuole lui
« Risposta #8 il: 07 Novembre 2013, 19:59:31 CET »
0
Puoi lanciare il logcat da linea di comando a telefono collegato, su Linux fa ma suppongo pure su Windows

Offline Vittorio

  • Nuovo arrivato
  • *
  • Post: 21
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    sony xperia p
  • Play Store ID:
    Vittorio Calligaris
  • Sistema operativo:
    windows 7 / Ubuntu 12.10
Re:Parsing JSON va solo quando vuole lui
« Risposta #9 il: 07 Novembre 2013, 20:15:11 CET »
0
ho messo un alert ogni riga e si ferma tra String line = null e il while, ovvero visualizzo: inizio 1 2 3 e poi piu nulla


Codice (Java): [Seleziona]
try
            {
                        alert("inizio");
                    BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8);
                    alert("1");
                    StringBuilder sb = new StringBuilder();
                    alert("2");
                    String line = null;
                    alert("3");
                    while ((line = reader.readLine()) != null)
                    {
                        alert("siamo nel while");
                            sb.append(line + "\n");
                            if (line==null) alert("line è null");
                             
                            result=sb.toString();
                    }
                    alert("siamo fuori dal while");
                    is.close();
                    alert("4");
                    result=sb.toString();
                    alert("4");
            }

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Parsing JSON va solo quando vuole lui
« Risposta #10 il: 07 Novembre 2013, 20:54:41 CET »
0
Allora mi sa che è perchè la readLine() è blocking, cioè rimane indefinitamente in attesa finchè non riceve un fine riga \n.

Simulatore e telefono sono la stessa versione di android?
I dati provengono da una connessione di rete o da un file? L'inputstream è gestito in un thread separato da quello di UI?
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline Vittorio

  • Nuovo arrivato
  • *
  • Post: 21
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    sony xperia p
  • Play Store ID:
    Vittorio Calligaris
  • Sistema operativo:
    windows 7 / Ubuntu 12.10
Re:Parsing JSON va solo quando vuole lui
« Risposta #11 il: 08 Novembre 2013, 16:10:20 CET »
0
Ho capito il problema:
i dati vengono scaricati con un asynctask e is veniva recuperato con un get.
Però se l'operazione in backgroud non viene completata in tempo is rimane vuoto (almeno credo).
Infatti essendo il simulatore molto lento, su di esso i dati venivano scaricati sempre in tempo. Sui telefoni invece questo succedeva solo quando lo scaricamento era particolarmente veloce
Adesso anzichè recuperare is con un get ho messo il resto delle operazioni nell'onPostExecute e sembra funzionare.


Adesso rimane un ultimo problema:
il compilatore non mi lascia creare un array adapter nell'onPostExecute:

ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this, R.layout.elementolist,R.id.listItem);
mi da errore e nessun consiglio


Grazie per l'aiuto
« Ultima modifica: 08 Novembre 2013, 16:20:10 CET da Vittorio »

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Parsing JSON va solo quando vuole lui
« Risposta #12 il: 08 Novembre 2013, 16:29:42 CET »
0
Può darsi che il problema sia che devi dichiarare la variabile ArrayAdapter<String> arrayAdapter a livello di activity e a quel punto puoi assegnarla anche dentro la onPostExecute.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline Vittorio

  • Nuovo arrivato
  • *
  • Post: 21
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    sony xperia p
  • Play Store ID:
    Vittorio Calligaris
  • Sistema operativo:
    windows 7 / Ubuntu 12.10
Re:Parsing JSON va solo quando vuole lui
« Risposta #13 il: 08 Novembre 2013, 16:39:02 CET »
0
Ti sposo    :-P