2017-03-21 6 views
0

Ich versuche, die JSON zu analysieren:JSON Androi Parsen JSONArray

{ 
    "shopId": 45123, 
    "name":"London", 
    "desc":"# The city\n## Intro\n**London** is the capital and most populous city of England and the United Kingdom, as well as the most populous municipality in the European Union. Standing on the _River Thames_ in the south east of the island of Great Britain \n## History \n London has been a major settlement for two millennia. It was founded by the Romans, who named it [Londinium](https://en.wikipedia.org/wiki/Londinium). London's ancient core, the City of London, largely retains its 1.12-square-mile (2.9 km2) medieval boundaries.", 
    "priceRating": 4.2, 
    "qualityRating":5.0, 
    "thumbnail":"https://s-media-cache-ak0.pinimg.com/736x/90/63/4e/90634e974743ed9409f527e3b2f24852.jpg", 
    "stops": 
    [ 
     { 
      "num": 1, 
      "time": "2016-04-27T06:15:00.000Z", 
      "title":"Flight to London", 
      "desc":"Barcelona BCN-London-Gatwick LGW", 
      "type":"0", 
      "subtype":0 
     }, 
     { 
      "num": 2, 
      "time": "2016-04-27T10:35:00.000Z", 
      "title":"Gatwick express", 
      "desc":"From Airport to London", 
      "type":"0", 
      "subtype":1 
     }, 
     { 
      "num": 3, 
      "time": "2016-04-27T12:15:00.000Z", 
      "title":"Pub the black horse", 
      "desc":"From Airport to London", 
      "type":1, 
      "subtype":1, 
      "location": "51.476334, -0.062700", 
      "images": [     "https://fitzrovianews.files.wordpress.com/2011/01/black_horse_rathbone_pl.jpg" 
      ]    
     }, 
     { 
      "num": 4, 
      "time": "2016-04-27T12:16:47.000Z", 
      "title":"The Tower Bridge", 
      "desc":"# The Tower Bridge Facts\n## Architecture\n**Tower Bridge** is a combined bascule and suspension bridge in London built in _1886–1894_. The bridge crosses the River Thames close to the Tower of London and has become an iconic symbol of London. Tower Bridge is one of five London bridges now owned and maintained by the Bridge House Estates, a charitable trust overseen by the City of London Corporation. \n>It is the only one of the Trust's bridges not to connect the City of London directly to the Southwark bank, as its northern landfall is in Tower Hamlets.\n## The bridge Exhibition\nThis must-see London attraction invites you to step inside the most famous bridge in the world to explore its iconic structure, spectacular views and glass floor, modern exhibitions and magnificent Victorian Engine Rooms! ", 
      "type":1, 
      "subtype":6, 
      "location": "51.507792, -0.087786", 
      "images": [     
    "https://i.ytimg.com/vi/nby0Mr2LfBQ/hqdefault.jpg", 
    "http://raindropsofsapphire.com/wp-content/uploads/2011/10/london-bridge.jpg", 
    "http://www.londonforfree.net/gizmo/wp-content/uploads/2015/02/southwark-bridge.jpg" 
      ]    
     }, 
     { 
      "num": 5, 
      "time": "2016-04-27T12:18:10.000Z", 
      "title":"St. Paul Cathedral", 
      "desc":"# HISTORY \nSt **Paul's Cathedral**, London, is an _Anglican cathedral_, the seat of the _Bishop of London_ and the mother church of the Diocese of London. \n * It sits on Ludgate Hill at the highest point of the City of London and is a Grade 1 listed building. \n * Its dedication to Paul the Apostle dates back to the original church on this site, founded in AD 604.", 
      "type":1, 
      "subtype":6, 
      "location": "51.513825, -0.098351", 
      "images": [     
    "https://d1wgio6yfhqlw1.cloudfront.net/sysimages/product/resized6/Interior_St_Pauls_Cathedral_132_12992.jpg", 
    "https://d1kioxk2jrdjp.cloudfront.net/resized/486x324/48-st_pauls_ctahedral_millenirm_bridge.jpg", 
    "http://i4.mirror.co.uk/incoming/article8299330.ece/ALTERNATES/s615b/LOND-2016-052-HMQ-St-Pauls-Thanks-Giving-704JPG.jpg" 
      ]    
     } 
    ] 
} 

Das Problem kommt, wenn ich versuche, die "Bilder" Element mit dem nächsten Code zu analysieren:

for (int i = 0; i < stops.length(); i++) { 
      JSONObject c = stops.getJSONObject(i); 
..... 


if(c.has("images") && !c.isNull("images")){ 
       JSONArray imagenes = jsonObj.getJSONArray("images"); 
       for (int j = 0; j < imagenes.length(); j++) { 
        String valueString= imagenes.getString(i); 
        Log.d("myTag", "Viatge Parser con valuestring" + valueString); 
         URL url2 = new URL(valueString); 
         HttpURLConnection connection = (HttpURLConnection) url2.openConnection(); 
         connection.setDoInput(true); 
         connection.connect(); 
         InputStream input = connection.getInputStream(); 
         Bitmap miBitmap = BitmapFactory.decodeStream(input); 
         s.addImage(miBitmap); 
        } 


       } 

ich bin comproving schon, wenn „Bilder“ existieren mit, aber ich erhalte immer diese Fehlermeldung:

03-22 00:23:51.391 23180-23797/com.example.usuari.myapplication3 I/System.out: (HTTPLog)-Static: isSBSettingEnabled false 
03-22 00:23:51.391 23180-23797/com.example.usuari.myapplication3 I/System.out: (HTTPLog)-Static: isSBSettingEnabled false 
03-22 00:23:51.801 23180-23797/com.example.usuari.myapplication3 W/System.err: org.json.JSONException: No value for images 
03-22 00:23:51.801 23180-23797/com.example.usuari.myapplication3 W/System.err:  at org.json.JSONObject.get(JSONObject.java:389) 
03-22 00:23:51.801 23180-23797/com.example.usuari.myapplication3 W/System.err:  at org.json.JSONObject.getJSONArray(JSONObject.java:584) 
03-22 00:23:51.801 23180-23797/com.example.usuari.myapplication3 W/System.err:  at com.example.usuari.myapplication3.ViatgeParser.parseFromJSON(ViatgeParser.java:97) 
03-22 00:23:51.801 23180-23797/com.example.usuari.myapplication3 W/System.err:  at com.example.usuari.myapplication3.DownloadAsyncTask.doInBackground(DownloadAsyncTask.java:38) 
03-22 00:23:51.801 23180-23797/com.example.usuari.myapplication3 W/System.err:  at com.example.usuari.myapplication3.DownloadAsyncTask.doInBackground(DownloadAsyncTask.java:17) 
03-22 00:23:51.801 23180-23797/com.example.usuari.myapplication3 W/System.err:  at android.os.AsyncTask$2.call(AsyncTask.java:295) 
03-22 00:23:51.801 23180-23797/com.example.usuari.myapplication3 W/System.err:  at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
03-22 00:23:51.801 23180-23797/com.example.usuari.myapplication3 W/System.err:  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) 
03-22 00:23:51.801 23180-23797/com.example.usuari.myapplication3 W/System.err:  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) 
03-22 00:23:51.801 23180-23797/com.example.usuari.myapplication3 W/System.err:  at java.lang.Thread.run(Thread.java:818) 

ich verstehe nicht, wie kann ich diese bekommen Fehler, wenn ich die if-Anweisung bereits richtig einchecke!

+0

Sie überprüfen 'c' für „Bilder“ und dann versuchen, „Bilder“ von einem 'jsonObj' zu bekommen. Ist das ein Tippfehler in Ihrem Codebeispiel? Oder ist das dein Problem? – loeschg

+0

verwenden Sie dies, JSONArray imagenes = c.getJSONArray ("images"); –

Antwort

3

Ändern Sie diese JSONArray imagenes = jsonObj.getJSONArray("images");
Zu diesem JSONArray imagenes = c.getJSONArray("images");

1

Ich habe Ihren Code nicht debugged, nur eine Sache, die aufgetaucht ist. Sollte es c statt jsonObj sein?

JSONArray imagenes = c.getJSONArray("images"); 
1

diese Zeile ersetzen, wie folgt:

JSONArray imagenes = c.getJSONArray("images"); 
0

ändern diese:

JSONArray imagenes = jsonObj.getJSONArray("images"); 

zu:

JSONArray imagenes = c.getJSONArray("images"); 
0
for (int i = 0; i < stops.length(); i++) { 
     JSONObject c = stops.getJSONObject(i); 



     if(c.has("images") && !c.isNull("images")){ 
      JSONArray imagenes = jsonObj.optJSONArray("images"); 
      if(imagenes!=null) { 
       for (int j = 0; j < imagenes.length(); j++) { 
        String valueString = imagenes.getString(i); 
        Log.d("myTag", "Viatge Parser con valuestring" + valueString); 
        URL url2 = new URL(valueString); 
        HttpURLConnection connection = (HttpURLConnection) url2.openConnection(); 
        connection.setDoInput(true); 
        connection.connect(); 
        InputStream input = connection.getInputStream(); 
        Bitmap miBitmap = BitmapFactory.decodeStream(input); 
        s.addImage(miBitmap); 
       } 
      } 


     }