Autore Topic: Parsing JSON  (Letto 2371 volte)

Offline teabof

  • Nuovo arrivato
  • *
  • Post: 10
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Sidux, Win7
Parsing JSON
« il: 28 Maggio 2010, 16:07:43 CEST »
0
Ciao,
dovrei far leggere al mio androide un file json così strutturato:
Codice (Java): [Seleziona]
{
"dato1":13,
"dati2":
                        {
                                "x":400,
                                "y":400
                        },

"dati3":
                        [
                        {
                                "var":"x",
                                "valore":1
                        },
                        {
                                "var":"y",
                                "valore":21
                        }
                        ]
}
Faccio così:
Codice (Java): [Seleziona]
                Dati dati= new dati(); //oggetto della classe dati opportunamente costruito in base al file json
                String x = "";
                InputStream is = this.getResources().openRawResource(R.raw.filejson); //il filejson è nella cartella res/raw
                byte [] buffer = new byte[is.available()];
                while (is.read(buffer) != -1);
                String json = new String(buffer);
                obj = new JSONObject(json);
                dati.dato1=obj.getInt("dato1");
In questo modo leggo correttamente il dato1. Provo ora a leggere dati2
Codice (Java): [Seleziona]
                JSONObject dati2=  obj.getJSONObject("dati2");
                dati.dati2.x=dati2.getInt("x");
                dati.dati2.y=dati2.getInt("y");
e qui non funziona! :'( anche provando ad usare un try/catch non ho capito che errore ha, non mi stampa nulla!)
Provo a leggere dati3:
Codice (Java): [Seleziona]
                JSONArray dati3= obj.getJSONArray("dati3");
               
                int i;
                for (i=0;i<dati3.length();i++) //ciclo che itera n volte, con n = numero di variabili
                {
                        JSONObject yy = dati3.getJSONObject(i);
                        dati.dati3.var[i]=yy.getString("var");
                        dati.dati3.valore[i]=yy.getString("valore") ;
                }
e anche qui non va..

avete idee? sicuramente sarà una banalità, ma è da un paio d'ore che provo varie soluzioni senza cavarci nulla!

Offline Qlimax

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 757
  • Respect: +202
    • Google+
    • _Qlimax
    • Mostra profilo
    • www.egsolutions.ch
  • Dispositivo Android:
    Galaxy Nexus - Nexus One - Wildfire - Magic
  • Play Store ID:
    egsolutions.ch
  • Sistema operativo:
    Ubuntu 12.04, Windows 7
Re:Parsing JSON
« Risposta #1 il: 28 Maggio 2010, 18:50:39 CEST »
0
Ciao teabof,
ho riscritto svelto quello che vuoi fare, con un paio di modifiche.
Ti sconsiglio di usare InputStream.available() per istanziare il buffer, in quanto quella è una stima dei bytes presenti e non un valore preciso.
Ti allego uno zip  O:-)

Codice (Java): [Seleziona]
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import org.json.JSONArray;
import org.json.JSONObject;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;

public class Demo extends Activity {
        static String tag = "demo";

        @Override
        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.main);
                InputStream is = getResources().openRawResource(R.raw.filejson);
                BufferedReader br = null;
                String jsonStr = "";

                try {
                        br = new BufferedReader(new InputStreamReader(is));

                        String line;
                        StringBuilder sb = new StringBuilder();

                        while ((line = br.readLine()) != null) {
                                sb.append(line).append("\n");
                        }

                        jsonStr = sb.toString();

                        JSONObject jsonObj = new JSONObject(jsonStr);
                        Log.v(tag, "" + jsonObj.getInt("dato1"));

                        JSONObject dati2 = jsonObj.getJSONObject("dati2");
                        Log.v(tag, "" + dati2.getInt("x"));
                        Log.v(tag, "" + dati2.getInt("y"));

                        JSONArray dati3 = jsonObj.getJSONArray("dati3");
                        JSONObject dati3_0 = dati3.getJSONObject(0);

                        Log.v(tag, dati3_0.getString("var"));
                        Log.v(tag, dati3_0.getString("valore"));

                        JSONObject dati3_1 = dati3.getJSONObject(1);

                        Log.v(tag, dati3_1.getString("var"));
                        Log.v(tag, dati3_1.getString("valore"));

                } catch (Exception e) {
                        e.printStackTrace();
                } finally {
                        try {
                                if (br != null) {
                                        br.close();
                                }
                        } catch (IOException e) {
                                e.printStackTrace();
                        }
                }

        }
}

Saluti.
Qlimax

Offline teabof

  • Nuovo arrivato
  • *
  • Post: 10
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Sidux, Win7
Re:Parsing JSON
« Risposta #2 il: 29 Maggio 2010, 17:01:19 CEST »
0
per prima cosa grazie..
in pratica fai così (correggimi se sbaglio): in jsonStr  salvi il file json,quindi crei un oggetti json (jsonbj) quindi procedi all'estrazione dei dati. Tramite Log.v(....) crei un log per catturare eventuali errori?

grazie!!




aggiornamento:
provando le tue modifiche (ho eliminato i vari log.v in quanto attendo una tua conferma) per la lettura dei dati purtroppo non ho ottenuto risultati. La lettura si pianta non appena scende di livello nella struttura dati (dati2-->x)
« Ultima modifica: 29 Maggio 2010, 18:37:48 CEST da teabof »

Offline Qlimax

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 757
  • Respect: +202
    • Google+
    • _Qlimax
    • Mostra profilo
    • www.egsolutions.ch
  • Dispositivo Android:
    Galaxy Nexus - Nexus One - Wildfire - Magic
  • Play Store ID:
    egsolutions.ch
  • Sistema operativo:
    Ubuntu 12.04, Windows 7
Re:Parsing JSON
« Risposta #3 il: 30 Maggio 2010, 20:56:52 CEST »
0
Log serve per fare debugging, che non vuol dire solo catturare errori, ma anche stampare a video (nel logcat) valori. Se conosci java se, paragonalo al System.out.println() o System.err.println()
Log | Android Developers

in questo caso ho usato Log.v per stampare nel logcat i valori letti dalla stringa json.

per visualizzare il logcat in eclipse: Window->show view->other...->Android->logcat

per quanto riguarda l aggiornamento, come fai a dire che non legge tutto il file, se hai tolto i log? non è che forse il tuo problema sta da un altra parte?


ps: ad ogni modo, ti ho allegato un progetto eclipse, provalo visualizzando il logcat, e ti accorgerai che funziona.


« Ultima modifica: 30 Maggio 2010, 20:58:37 CEST da Qlimax »

Offline teabof

  • Nuovo arrivato
  • *
  • Post: 10
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Sidux, Win7
Re:Parsing JSON
« Risposta #4 il: 31 Maggio 2010, 11:00:30 CEST »
0
ciao!
il tuo progetto funziona perfettamente! Non avevo guardato logcat, pensavo stampasse in console i risultati..
Dato che a me interessa salvare i dati letti dal file json in un oggetto così da riutilizzarli in seguito dovrebbe bastare far così, giusto?
Codice (Java): [Seleziona]
StrutturaDati prova= new StrutturaDati(); //oggetto di classe StrutturaDati progettata ad hoc per il file json
prova.dato1=jsonObj.getInt("dato1");
//e così via per gli altri campi
il mio programmino dovrebbe mostrare sul dispositivo android i dati letti. Credo che non legga tutto il file in quanto ho visto che commentando la parte relativa ai dati di livello inferiore tutto funziona, come nella situazione iniziale!

Offline Qlimax

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 757
  • Respect: +202
    • Google+
    • _Qlimax
    • Mostra profilo
    • www.egsolutions.ch
  • Dispositivo Android:
    Galaxy Nexus - Nexus One - Wildfire - Magic
  • Play Store ID:
    egsolutions.ch
  • Sistema operativo:
    Ubuntu 12.04, Windows 7
Re:Parsing JSON
« Risposta #5 il: 31 Maggio 2010, 11:08:38 CEST »
0
ciao!
il tuo progetto funziona perfettamente! Non avevo guardato logcat, pensavo stampasse in console i risultati..
Dato che a me interessa salvare i dati letti dal file json in un oggetto così da riutilizzarli in seguito dovrebbe bastare far così, giusto?
Codice (Java): [Seleziona]
StrutturaDati prova= new StrutturaDati(); //oggetto di classe StrutturaDati progettata ad hoc per il file json
prova.dato1=jsonObj.getInt("dato1");
//e così via per gli altri campi

in teoria si, dovrebbe funzionare così.

il mio programmino dovrebbe mostrare sul dispositivo android i dati letti. Credo che non legga tutto il file in quanto ho visto che commentando la parte relativa ai dati di livello inferiore tutto funziona, come nella situazione iniziale!
se nel logcat vedi i valori, vuol dire che il file viene letto...

forse se posti un po piu del tuo codice posso aiutarti meglio ;)

bye



Offline teabof

  • Nuovo arrivato
  • *
  • Post: 10
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Sidux, Win7
Re:Parsing JSON
« Risposta #6 il: 31 Maggio 2010, 11:25:46 CEST »
0
ecco qui quello che ho fatto per ora:
Codice (Java): [Seleziona]
public class prova_json extends Activity {
       
   
    /** Called when the activity is first created. */
    @Override
   
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
               
        Button btnFile = (Button) findViewById(R.id.btnTestFile);
        btnFile.setOnClickListener(new Button.OnClickListener()
        {
                public void onClick(View v)
                {
                        PrendiDati();
                }
        });
       
       
       
    }


void PrendiDati()
    {
        InputStream is = getResources().openRawResource(R.raw.filejson);
        BufferedReader br = null;
        String jsonStr = "";
        int dato1,dati2_0,dati2_1;
        String dati3_00, dati3_01, dati3_10, dati3_11,x;
        x="";
        try {
            br = new BufferedReader(new InputStreamReader(is));

            String line;
            StringBuilder sb = new StringBuilder();

            while ((line = br.readLine()) != null) {
                    sb.append(line).append("\n");
            }

            jsonStr = sb.toString();

            JSONObject jsonObj = new JSONObject(jsonStr);
            dato1=jsonObj.getInt("dato1");

            JSONObject dati2 = jsonObj.getJSONObject("dati2");
            dati2_0=dati2.getInt("x");
            dati2_1=dati2.getInt("y");
           
            JSONArray dati3 = jsonObj.getJSONArray("dati3");
            JSONObject dati3_0 = dati3.getJSONObject(0);

            dati3_00=dati3_0.getString("var");
            dati3_01=dati3_0.getString("valore");
           
            JSONObject dati3_1 = dati3.getJSONObject(1);
            dati3_10=dati3_1.getString("var");
            dati3_11=dati3_1.getString("valore");
           
            x="Dato 1: "+ dato1 + "\n";
            x+="dati2= "+ dati2_0 + ", " + dati2_1;
            x+="\n dati3: "+dati3_00+ ": "+ dati3_01 + "\n";
            x+="\n dati3_1: "+dati3_10+ ": "+ dati3_11 + "\n";
            Stampa(x);
    } catch (Exception e) {
            e.printStackTrace();
    } finally {
            try {
                    if (br != null) {
                            br.close();
                           
                    }
            } catch (IOException e) {
                    e.printStackTrace();
            }
    }
       
    }
    void Stampa(String x)
    {
                TextView tv = (TextView) findViewById(R.id.txtStatus);
                tv.setText(x);          
    }
ho l'esame di java a fine mese di giugno ma mi sta facendo impazzire! >:(


edit: spostando stampa nel finally ora funziona!

faccio altre prove e poi eventualmente indico il topic come risolto!! mi sei stai di grande aiuto Qlimax, se quando ho finito tutto è calido potrei quasi creare una piccola guida per leggere i json!
« Ultima modifica: 31 Maggio 2010, 11:49:03 CEST da teabof, Reason: novità »

Offline Qlimax

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 757
  • Respect: +202
    • Google+
    • _Qlimax
    • Mostra profilo
    • www.egsolutions.ch
  • Dispositivo Android:
    Galaxy Nexus - Nexus One - Wildfire - Magic
  • Play Store ID:
    egsolutions.ch
  • Sistema operativo:
    Ubuntu 12.04, Windows 7
Re:Parsing JSON
« Risposta #7 il: 31 Maggio 2010, 11:50:29 CEST »
0
non ho capito, questo pezzo di codice se ti funziona o no.
perchè non usi la struttura dati che hai creato, con un bel toString magari... ?
« Ultima modifica: 31 Maggio 2010, 11:53:08 CEST da Qlimax »

Offline Qlimax

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 757
  • Respect: +202
    • Google+
    • _Qlimax
    • Mostra profilo
    • www.egsolutions.ch
  • Dispositivo Android:
    Galaxy Nexus - Nexus One - Wildfire - Magic
  • Play Store ID:
    egsolutions.ch
  • Sistema operativo:
    Ubuntu 12.04, Windows 7
Re:Parsing JSON
« Risposta #8 il: 31 Maggio 2010, 11:52:24 CEST »
0
se nel finally stampa, vuol dire che ti lanciava un eccezione prima della riga in cui chiamavi stampa

Offline teabof

  • Nuovo arrivato
  • *
  • Post: 10
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Sidux, Win7
Re:Parsing JSON
« Risposta #9 il: 31 Maggio 2010, 11:54:38 CEST »
0
la struttura dati era ancora nella mia testa ;-), non l'ho ancora scritta. Nel frattempo avevo usato delle semplici variabili giusto per vedere se riuscivo a leggere questo benedetto file Json.

non capisco, ora ho rimesso Stampa(x) nel try e ora va, probabilmente ho modificato qualcosa senza pensarci, oppure o fatto qualche cavolata mentre provavo l'app. Appena sistemo il tutto posto qui il risultato!

Offline Qlimax

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 757
  • Respect: +202
    • Google+
    • _Qlimax
    • Mostra profilo
    • www.egsolutions.ch
  • Dispositivo Android:
    Galaxy Nexus - Nexus One - Wildfire - Magic
  • Play Store ID:
    egsolutions.ch
  • Sistema operativo:
    Ubuntu 12.04, Windows 7
Re:Parsing JSON
« Risposta #10 il: 31 Maggio 2010, 12:02:33 CEST »
0
la struttura dati era ancora nella mia testa ;-), non l'ho ancora scritta. Nel frattempo avevo usato delle semplici variabili giusto per vedere se riuscivo a leggere questo benedetto file Json.

non capisco, ora ho rimesso Stampa(x) nel try e ora va, probabilmente ho modificato qualcosa senza pensarci, oppure o fatto qualche cavolata mentre provavo l'app. Appena sistemo il tutto posto qui il risultato!
:D ottimo
un ultimo consiglio:
i nomi dei metodi scrivili in piccolo, tipo prendiDati() ed invece i nomi delle classi in grande tipo JsonParsing(http://java.sun.com/docs/codeconv/html/CodeConventions.doc8.html). Inoltre cerca sempre di specificare uno scope per i metodi (public,private,protected) ed infine quando crei la struttura dati , usa l'incapsulamento (Java - Encapsulation) per la lettura e la scrittura dei dati

Offline teabof

  • Nuovo arrivato
  • *
  • Post: 10
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Sidux, Win7
Re:Parsing JSON
« Risposta #11 il: 31 Maggio 2010, 14:30:26 CEST »
0
mm..è possibile che alcune parole come widht, height e altre diano problemi in lettura? In pratica il mio esercizio consiste nel prendere un file json da internet e creare una semplice app che ne mostrasse il contenuto. Con un mio compagno abbiamo scelto in file json fornito da multimap.com e ora mi sto apprestando ad applicare quanto visto nei post precedenti: il problema è appunto che appena leggo queste parole il prog non funziona più! tra un attimo posto tutto il codice scritto!
Json
Codice (Java): [Seleziona]
{"zoom_factor":13,"dimensions":{"width":400,"height":400},"zoom_urls":{"out":"http://www.multimap.com/API/map/1.2/OA10051419843658519?output=json&lat=45.647696&lon=9.598191&zoom=-1","in":"http://www.multimap.com/API/map/1.2/OA10051419843658519?output=json&lat=45.647696&lon=9.598191&zoom=1"},"bounds":{"south_west":{"lat":"45.59968","lon":"9.52953"},"north_east":{"lat":"45.69568","lon":"9.66685"}},"orig_map_center":{},"map_data":[{"name":"Tele Atlas","id":916}],"map_center":{"point":{"lat":"45.64770","lon":"9.59819"},"tile":{"y":2629.92361699214,"x":2157.20607475712}},"marker":[{"opacity":null,"text_size":null,"point":{"lat":"45.64770","lon":"9.59819"},"icon_name":"default.png","meta_data":{"y":200.01667,"x":200.00291},"label":1}],"pan_urls":{"south":"http://www.multimap.com/API/map/1.2/OA10051419843658519?output=json&lat=45.647696&lon=9.598191&moveMap=0,240","south_west":"http://www.multimap.com/API/map/1.2/OA10051419843658519?output=json&lat=45.647696&lon=9.598191&moveMap=-240,240","south_east":"http://www.multimap.com/API/map/1.2/OA10051419843658519?output=json&lat=45.647696&lon=9.598191&moveMap=240,240","west":"http://www.multimap.com/API/map/1.2/OA10051419843658519?output=json&lat=45.647696&lon=9.598191&moveMap=-240,0","east":"http://www.multimap.com/API/map/1.2/OA10051419843658519?output=json&lat=45.647696&lon=9.598191&moveMap=240,0","north":"http://www.multimap.com/API/map/1.2/OA10051419843658519?output=json&lat=45.647696&lon=9.598191&moveMap=0,-240","north_west":"http://www.multimap.com/API/map/1.2/OA10051419843658519?output=json&lat=45.647696&lon=9.598191&moveMap=-240,-240","north_east":"http://www.multimap.com/API/map/1.2/OA10051419843658519?output=json&lat=45.647696&lon=9.598191&moveMap=240,-240"},"map_url":"http://www.multimap.com/API/map/1.2/OA10051419843658519?output=png&lat=45.647696&lon=9.598191"}
codice: StrutturaDati  è una classe ad hoc, il cui metodo toString() restituisce appunto una stringa contenente tutti i dati raccolti

Codice (Java): [Seleziona]
void PrendiDati()
    {
        InputStream is = getResources().openRawResource(R.raw.filejson);
        BufferedReader br = null;
        String jsonStr = "";
       
        try {
           
            StrutturaDati dati= new StrutturaDati ();
                String x = "";
                br = new BufferedReader(new InputStreamReader(is));
            String line;
            StringBuilder sb = new StringBuilder();

            while ((line = br.readLine()) != null) {
                    sb.append(line).append("\n");
            }

            jsonStr = sb.toString();

            JSONObject obj = new JSONObject(jsonStr);
           
            dati.zoom=obj.getInt("zoom_factor");
            dati.map_url=obj.getString("map_url");              
           
            //zoom_urls
            JSONObject zoom_urls= obj.getJSONObject("zoom_urls");
            dati.z_urls.out=zoom_urls.getString("out");
            dati.z_urls.in=zoom_urls.getString("in");
           
            //bounds
            JSONObject bounds = obj.getJSONObject("bounds");
           
            JSONObject sw = bounds.getJSONObject("south_west");
            dati.bounds.south_w.lat=sw.getDouble("lat");
            dati.bounds.south_w.lon=sw.getDouble("lon");
           
            JSONObject ne = bounds.getJSONObject("north_east");
            dati.bounds.north_e.lat=ne.getDouble("lat");
            dati.bounds.north_e.lon=ne.getDouble("lon");
           
            //map data
            JSONArray map_data = obj.getJSONArray("map_data");
           
            JSONObject map_data00 = map_data.getJSONObject(0);
            dati.map_data.name=map_data00.getString("name");
            dati.map_data.id=map_data00.getString("id");
           
            //map center
            JSONObject map_center = obj.getJSONObject("bounds");
           
            JSONObject point = map_center.getJSONObject("point");
            dati.map_center.point.lat=point.getDouble("lat");
            dati.map_center.point.lon=point.getDouble("lon");
           
            JSONObject tile = map_center.getJSONObject("tile");
            dati.map_center.tile.lat=tile.getDouble("lat");
            dati.map_center.tile.lon=tile.getDouble("lon");
           
            //marker
            JSONArray marker = obj.getJSONArray("marker");
            JSONObject opacity = marker.getJSONObject(0);
            dati.marker.opac=opacity.getString("opacity");
            JSONObject text_size = marker.getJSONObject(1);
            dati.marker.tsize=text_size.getInt("text_size");
            JSONObject m_point = marker.getJSONObject(2);
            dati.marker.point.lat=m_point.getDouble("lat");
            dati.marker.point.lon=m_point.getDouble("lon");
            JSONObject icon_name= marker.getJSONObject(3);
            dati.marker.iconname=icon_name.getString("icon_name");
            JSONObject meta_data= marker.getJSONObject(4);
            dati.marker.metadata.lat=meta_data.getDouble("y");
            dati.marker.metadata.lon=meta_data.getDouble("x");
            JSONObject label= marker.getJSONObject(5);
            dati.marker.label=label.getInt("label");
           
            //pan urls
            JSONObject pan_urls = obj.getJSONObject("pan_urls");
            dati.pan_urls.s=pan_urls.getString("south");
            dati.pan_urls.sw=pan_urls.getString("south_west");
            dati.pan_urls.se=pan_urls.getString("south_east");
            dati.pan_urls.w=pan_urls.getString("west");
            dati.pan_urls.e=pan_urls.getString("east");
            dati.pan_urls.n=pan_urls.getString("north");
            dati.pan_urls.nw=pan_urls.getString("north_west");
            dati.pan_urls.ne=pan_urls.getString("north_east");
           
            x=dati.toString();
                                       
            Stampa(x);
   
    } catch (Exception e) {
            e.printStackTrace();
    } finally {
            try {
                    if (br != null) {
                            br.close();
                    }
            } catch (IOException e) {
                    e.printStackTrace();
            }
    }
       
    }
    void Stampa(String x)
    {
                TextView tv = (TextView) findViewById(R.id.txtStatus);
                tv.setText(x);          
    }

ps: oltre alle varie correzioni grazie dei preziosi suggerimenti su java!
« Ultima modifica: 31 Maggio 2010, 14:47:40 CEST da teabof »

Offline teabof

  • Nuovo arrivato
  • *
  • Post: 10
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Sidux, Win7
Re:Parsing JSON
« Risposta #12 il: 03 Giugno 2010, 17:31:46 CEST »
0
nessuno ha qualche idea?

Offline Qlimax

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 757
  • Respect: +202
    • Google+
    • _Qlimax
    • Mostra profilo
    • www.egsolutions.ch
  • Dispositivo Android:
    Galaxy Nexus - Nexus One - Wildfire - Magic
  • Play Store ID:
    egsolutions.ch
  • Sistema operativo:
    Ubuntu 12.04, Windows 7
Re:Parsing JSON
« Risposta #13 il: 04 Giugno 2010, 01:01:31 CEST »
0
guarda, per semplicità, se posti lo zip del progetto a cui stai lavorando, sono sicuro che io o qualcun'altro riusciremo a darti una mano.

Offline teabof

  • Nuovo arrivato
  • *
  • Post: 10
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Sidux, Win7
Re:Parsing JSON
« Risposta #14 il: 06 Giugno 2010, 20:56:12 CEST »
0
ecco qui il progetto..è ancora, fintanto che non risolvo il problema con questo file json, moooooolto approssimativo!
« Ultima modifica: 06 Giugno 2010, 21:06:10 CEST da teabof »