Autore Topic: Lettura file JSON  (Letto 1667 volte)

Offline Lomba1986

  • Utente normale
  • ***
  • Post: 173
  • Respect: +1
    • Mostra profilo
Lettura file JSON
« il: 09 Agosto 2012, 18:08:39 CEST »
0
Ho chiuso il topic sul kml visto che trovando in internet ho scoperto che è Google in "persona" che ha cambiato le regole per accedere alle rotte tracciate con google maps...e che viene ritornato un file xml o un json strutturati una determinata maniera...

Chiedo ai moderatori scusa per questi due post, ma ho ritenuto "più" pulito tenere le questioni separate...

Ora ho forti problemi con la lettura del file json...

Invio la richiesta, le ricevo, la leggo tutta...ma non riesco ad avere le info sulla rotta da seguire...

il codice per la lettura del file e la costruzione dell'oggetto JSON:

Codice (Java): [Seleziona]
                String urlString = new String("http://maps.googleapis.com/maps/api/directions/json?" +
                                                                          "origin=Chicago,IL&destination=Los+Angeles,CA&waypoints=" +
                                                                          "Joplin,MO|Oklahoma+City,OK&sensor=false");

                Log.i("Tracciatura", "URL=" + urlString.toString());

                URL url = null;
                try {
                        url = new URL(urlString);
                } catch (MalformedURLException e) {
                        e.printStackTrace();
                }
                URLConnection connection = null;
                try {
                        connection = url.openConnection();
                } catch (IOException e) {
                        e.printStackTrace();
                }
               
               
                String line;
                StringBuilder builder = new StringBuilder();
                JSONObject json = null;
                BufferedReader reader = null;
                try {
                        reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
                } catch (IOException e1) {
                        e1.printStackTrace();
                }
                try {
                        while((line = reader.readLine()) != null) {
                                builder.append(line);
                                Log.i("Tracciatura","Stringa letta:"+line); //mi stampa fuori tutte le righe e ci "dovrebbe" essere tutto, almeno credo
                        }
                } catch (IOException e) {
                        e.printStackTrace();
                }
               
                try {
                        json = new JSONObject(builder.toString());
                } catch (JSONException e) {
                        e.printStackTrace();
                }
                Log.i("Tracciatura",""+json.length()); //MI DICE CHE HA LUNGHEZZA 2 ?!?!?!

Il conseguente codice per estrapolare tutte le info dall'oggetto json fallisce

Codice (Java): [Seleziona]
ArrayList<Bundle> list = new ArrayList<Bundle>();
                try
                {
                        JSONArray routes = json.getJSONArray("route");
                        JSONArray legs = routes.getJSONArray(0);
                        JSONArray steps = legs.getJSONArray(0);
                        for(int i=0;i<steps.length();i++)
                        {
                                JSONObject singleStep = steps.getJSONObject(i);
                            JSONObject duration = singleStep.getJSONObject("duration");
                            Bundle dur = new Bundle();
                            dur.putString("text", duration.getString("text"));
                            dur.putString("value", duration.getString("value"));
                            JSONObject distance = singleStep.getJSONObject("distance");
                            Bundle dis = new Bundle();
                            dis.putString("text", distance.getString("text"));
                            dis.putString("value", distance.getString("value"));
                            Bundle data = new Bundle();
                            data.putBundle("duration", dur);
                            data.putBundle("distance", dis);
                            list.add(data);
                        }
                } catch (JSONException e1) {
                        e1.printStackTrace();
                }
                Log.i("Tracciatura","list size: "+list.size()); //LISTA CON DIMENSIONE 0 ?!?!?

E sul Logcat ho queste eccezioni:

08-09 15:57:33.879: W/System.err(308): org.json.JSONException: No value for route
08-09 15:57:33.899: W/System.err(308):    at org.json.JSONObject.get(JSONObject.java:354)
08-09 15:57:33.899: W/System.err(308):    at org.json.JSONObject.getJSONArray(JSONObject.java:544)
08-09 15:57:33.899: W/System.err(308):    at prova.firstgps.Tracciatura.DrawPath(Tracciatura.java:129)
08-09 15:57:33.899: W/System.err(308):    at prova.firstgps.Tracciatura.onCreate(Tracciatura.java:62)
08-09 15:57:33.899: W/System.err(308):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
08-09 15:57:33.899: W/System.err(308):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
08-09 15:57:33.899: W/System.err(308):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
08-09 15:57:33.899: W/System.err(308):    at android.app.ActivityThread.access$2300(ActivityThread.java:125)
08-09 15:57:33.910: W/System.err(308):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
08-09 15:57:33.910: W/System.err(308):    at android.os.Handler.dispatchMessage(Handler.java:99)
08-09 15:57:33.910: W/System.err(308):    at android.os.Looper.loop(Looper.java:123)
08-09 15:57:33.910: W/System.err(308):    at android.app.ActivityThread.main(ActivityThread.java:4627)
08-09 15:57:33.910: W/System.err(308):    at java.lang.reflect.Method.invokeNative(Native Method)
08-09 15:57:33.910: W/System.err(308):    at java.lang.reflect.Method.invoke(Method.java:521)
08-09 15:57:33.910: W/System.err(308):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
08-09 15:57:33.910: W/System.err(308):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
08-09 15:57:33.910: W/System.err(308):    at dalvik.system.NativeStart.main(Native Method)


Qualcuno ha qualche idea??

Grazie a tutti quanti
Non esistono problemi, ma solo soluzioni...

Offline Lomba1986

  • Utente normale
  • ***
  • Post: 173
  • Respect: +1
    • Mostra profilo
Re:Lettura file JSON
« Risposta #1 il: 10 Agosto 2012, 10:22:13 CEST »
0
Ho una news...

ho controllato che cosa leggo dal file JSON, e lo leggo tutto correttamente...ma nel momento in cui eseguo il comando:

Codice (Java): [Seleziona]
json = new JSONObject(builder.toString());
sembra quasi che builder non contenga tutto quanto...è possibile che il file abbia una dimensione troppo grande e che ecceda le dimensioni massime dello StringBuilder?

Ciao a tutti
Non esistono problemi, ma solo soluzioni...

Offline Giovanni D'Addabbo

  • Utente normale
  • ***
  • Post: 163
  • Respect: +8
    • Google+
    • giovannid
    • giovanni.daddabbo
    • magoscuro
    • Mostra profilo
    • Rhubbit.it - Sviluppo app Android/iOs
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Rhubbit srl
  • Sistema operativo:
    Windows/Mac/Linux
Re:Lettura file JSON
« Risposta #2 il: 10 Agosto 2012, 12:08:46 CEST »
0
ma quello che ricevi te lo puoi salvare da qualche parte per poterlo verificare d persona?
non dovrebbe essere una questione di dimensioni massime cmq

Offline Lomba1986

  • Utente normale
  • ***
  • Post: 173
  • Respect: +1
    • Mostra profilo
Re:Lettura file JSON
« Risposta #3 il: 10 Agosto 2012, 12:17:55 CEST »
0
Ho verificato e il file lo ricevo tutto...

l'eccezione che mi genera ora è:

08-10 09:57:55.104: W/System.err(370): org.json.JSONException: Value {"waypoint_order":[],"summary":"A4","bounds":{"southwest":{"lng":9.18642,"lat":45.46207},"northeast":{"lng":10.21946,"lat":45.67001}},"legs":[{"duration":{"value":4120,"text":"1 hour 9 mins"},"distance":{"value":99462,"text":"99.5 km"},"end_location":{"lng":9.186520000000002,"lat":45.46546},"start_address":"Brescia, Province of Brescia, Italy","end_address":"Milan, Italy","start_location":{"lng":10.21944,"lat":45.54119},"via_waypoint":[],"steps":[{"html_instructions":"Head <b>north<\/b> on <b>Via San Faustino<\/b> toward <b>Via Elia Capriolo<\/b>","duration":{"value":4,"text":"1 min"},"distance":{"value":35,"text":"35 m"},"end_location":{"lng":10.21946,"lat":45.54150000000001},"polyline":{"points":"mw}tGo~j}@w@CE?"},"travel_mode":"DRIVING","start_location":{"lng":10.21944,"lat":45.54119}},{"html_instructions":"Turn <b>left<\/b> onto <b>Via Elia Capriolo<\/b>","duration":{"value":135,"text":"2 mins"},"distance":{"value":640,"text":"0.6 km"},"end_location":{"lng":10.2116,"lat":45.54317000000001},"polyline":{"points":"ky}tGs~j}@ETCVUjBQlAKr@Kx@Kv@a@nDIt@W|BMbAKdA_@lCIx@ObAk@vEGZk@fD"},"travel_mode":"DRIVING","start_location":{"lng":10.21946,"lat":45.54150000000001}},{"html_instructions":"Turn <b>left<\/b> onto <b>Via Nicolò Tartaglia<\/b>","duration":{"value":46,"text":"1 min"},"distance":{"value":160,"text":"0.2 km"},"end_location":{"lng":10.21092,"lat":45.54181000000001},"polyline":{"points":"yc~tGomi}@j@NlDzAl@VFB"},"travel_mode":"DRIVING","start_location":{"lng":10.2116,"lat":45.54317000000001}},{"html_instructions":"Turn <b>right<\/b> onto <b>Corso Giuseppe Garibaldi<\/b>","duration":{"value":30,"text":"1 min"},"distance":{"value":68,"text":"68 m"},"end_location":{"lng":10.2101,"lat":45.54203},"polyline":{"points":"i{}tGgii}@SnAWrA"},"travel_mode":"DRIVING","start_location":{"lng":10.21092,"lat":45.54181000000001}},{"html_instructions":"Continue onto <b>Via Milano<\/b><div style=\"font-size:0.9em\">Go through 2 roundabouts<\/div>","duration":{"value":171,"text":"3 mins"},"distance":{"value":1982,"text":"2.0 km"},"end_location":{"lng":10.18595,"lat":45.54683000000001},"polyline":{"points":"u|}tGcdi}@Q`AqAdHeBjKKp@QrAMrAGd@YvCYxBEj@CLo@~G_@rCA?A?A?A?A??@A?A@?@A??@A??@?@?@A??@?@?@?@?@?@?@@@?@?@@??@@@?@@??@@?Q~BGf@AJG\\K~@ADAJCNkAvIg@~DcAlIq@pFs@|GUbBM|@OvAMtBAVOxCGx@E|@GpAIvAIjAGt@MnAYpBA?A??AA?A?A?A?A?A??@A?A@?@A??@A@?@?@A??@?@?@?@?@?@?@?@?@?@@??@?@@@?@@??@@??@@?@@CNCLEXADCNCP"},"travel_mode":"DRIVING","start_location":{"lng":10.2101,"lat":45.54203}},{"html_instructions":"At the roundabout, take the <b>2nd<\/b> exit onto the <b>SS345<\/b> ramp to <b>Aeroporto Montichiari\/Mantova\/Cremona\/Verona<\/b>","duration":{"value":62,"text":"1 min"},"distance":{"value":273,"text":"0.3 km"},"end_location":{"lng":10.18465,"lat":45.54489},"polyline":{"points":"uz~tGemd}@A?A?A?A?A?A??@A?A@A??@A@?@A??@?@?@A??@?@?@?@?@?@?@?@?@@@?@?@@??@?@@??@@??@@??@@?@?@??@@?@??A@?@?@??A@??A@ARHNF^P\\VdAt@z@h@b@TTJ~AX"},"travel_mode":"DRIVING","start_location":{"lng":10.18595,"lat":45.54683000000001}},{"html_instructions":"Merge onto <b>SS345<\/b>","duration":{"value":118,"text":"2 mins"},"distance":{"value":1894,"text":"1.9 km"},"end_location":{"lng":10.17664,"lat":45.52882},"polyline":{"points":"qn~tGaed}@v@ZB@RFRHTJpHfDzHfCPFzCx@|GpBxDvA~@`@HDPH`LrFr@^fAj@HDLFd@V|Ap@xAp@jEdBhAb@d@RdA`@NFb@R|IfDJDnCbA"},"travel_mode":"DRIVING","start_location":{"lng":10.18465,"lat":45.54489}},{"html_instructions":"Take the ramp to <b>Milano\/Bergamo\/Venezia<\/b>","duration":{"value":19,"text":"1 min"},"distance":{"value":306,"text":"0.3 km"},"end_location":{"lng":10.17512,"lat":45.52632000000001},"polyline":{"points":"cj{tG_sb}@LNpCbAvB~@xBv@RNHFPNRLLPNZ"},"travel_mode":"DRIVING","start_location":{"lng":10.17664,"lat":45.52882}},{"html_instructions":"At the roundabout, take the <b>1st<\/b> exit onto the <b>SS11 dir<\/b> ramp to <b>Milano\/Bergamo\/SP IX\/Quinzano\/Venezia\/SP BS 510<\/b>","duration":{"value":29,"text":"1 min"},"distance":{"value":248,"text":"0.2 km"},"end_location":{"lng":10.1723,"lat"
08-10 09:57:55.114: W/System.err(370):    at org.json.JSON.typeMismatch(JSON.java:96)
08-10 09:57:55.114: W/System.err(370):    at org.json.JSONArray.getJSONArray(JSONArray.java:459)
08-10 09:57:55.114: W/System.err(370):    at prova.firstgps.Tracciatura.DrawPath(Tracciatura.java:130)
08-10 09:57:55.114: W/System.err(370):    at prova.firstgps.Tracciatura.onCreate(Tracciatura.java:62)
08-10 09:57:55.114: W/System.err(370):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
08-10 09:57:55.114: W/System.err(370):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
08-10 09:57:55.114: W/System.err(370):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
08-10 09:57:55.114: W/System.err(370):    at android.app.ActivityThread.access$1500(ActivityThread.java:117)
08-10 09:57:55.114: W/System.err(370):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
08-10 09:57:55.114: W/System.err(370):    at android.os.Handler.dispatchMessage(Handler.java:99)
08-10 09:57:55.114: W/System.err(370):    at android.os.Looper.loop(Looper.java:130)
08-10 09:57:55.114: W/System.err(370):    at android.app.ActivityThread.main(ActivityThread.java:3683)
08-10 09:57:55.114: W/System.err(370):    at java.lang.reflect.Method.invokeNative(Native Method)
08-10 09:57:55.114: W/System.err(370):    at java.lang.reflect.Method.invoke(Method.java:507)
08-10 09:57:55.124: W/System.err(370):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
08-10 09:57:55.124: W/System.err(370):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
08-10 09:57:55.124: W/System.err(370):    at dalvik.system.NativeStart.main(Native Method)

la prima eccezione quella più importante purtroppo eclipse la tronca perchè è troppo grande e quindi non la stampa tutta...
maledizione...

probabilmente è per quello che non mi stampava a video tutto il valore, in quanto eccedeva la grandezza massima del logcat...
Non esistono problemi, ma solo soluzioni...

Offline Giovanni D'Addabbo

  • Utente normale
  • ***
  • Post: 163
  • Respect: +8
    • Google+
    • giovannid
    • giovanni.daddabbo
    • magoscuro
    • Mostra profilo
    • Rhubbit.it - Sviluppo app Android/iOs
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Rhubbit srl
  • Sistema operativo:
    Windows/Mac/Linux
Re:Lettura file JSON
« Risposta #4 il: 10 Agosto 2012, 12:21:12 CEST »
0
ma non fai prima ad usare uno stream, salvi lo stream in un file di testo e successivamente te lo apri in tranquillità?

Offline Lomba1986

  • Utente normale
  • ***
  • Post: 173
  • Respect: +1
    • Mostra profilo
Re:Lettura file JSON
« Risposta #5 il: 10 Agosto 2012, 14:21:44 CEST »
0
Infatti è quello che faccio all'inizio per leggere il file

Codice (Java): [Seleziona]
String line;
                StringBuilder builder = new StringBuilder();
                JSONObject json = null;
                BufferedReader reader = null;
                try {
                        reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
                } catch (IOException e1) {
                        e1.printStackTrace();
                }
                try {
                        while((line = reader.readLine()) != null) {
                                builder.append(line);
                                //Log.i("Tracciatura","builder:"+builder.capacity());
                        }
                } catch (Exception e) {
                        e.printStackTrace();
                }
                try {
                        json = new JSONObject(builder.toString()); //creazione dell'oggetto JSON
                } catch (JSONException e) {
                        e.printStackTrace();
                }

Questo codice legge...l'errore arriva dopo...quando cerco di estrapolare dall'oggetto JSON i dati necessari
Non esistono problemi, ma solo soluzioni...