2015-03-16 7 views
-1

У меня возникли проблемы с попыткой доступа к определенным значениям в файле JSON. Файл содержит несколько объектов, хранящихся внутри массива.Извлечение строки из вложенных объектов в файл JSON || Android

Значение, которое мне нужно вернуть, составляет «60» внутри строки «maxspeed». Когда текущий код выполняется в отладке, он просто остается в цикле. * Не знаю, почему)

Значение строки «result» - это весь json-файл.

Может ли кто-нибудь объяснить, как получить доступ к этой ценности?

Спасибо.

JSON:

{ 
    "version": 0.6, 
    "generator": "Overpass API", 
    "osm3s": { 
    "timestamp_osm_base": "2015-03-16T00:27:03Z", 
    "copyright": "The data included in this document is from www.openstreetmap.org. The data is made available under ODbL." 
    }, 
    "elements": [ 

{ 
    "type": "node", 
    "id": 768053039, 
    "lat": 54.9526671, 
    "lon": -7.7273348 
}, 
{ 
    "type": "node", 
    "id": 768053040, 
    "lat": 54.9498094, 
    "lon": -7.7176056 
}, 
{ 
    "type": "node", 
    "id": 768053041, 
    "lat": 54.9497066, 
    "lon": -7.7173174 
}, 
{ 
    "type": "node", 
    "id": 768053043, 
    "lat": 54.9495658, 
    "lon": -7.7170937 
}, 
{ 
    "type": "node", 
    "id": 768053044, 
    "lat": 54.9495035, 
    "lon": -7.7169816 
}, 
{ 
    "type": "node", 
    "id": 791492493, 
    "lat": 54.9494183, 
    "lon": -7.7168205 
}, 
{ 
    "type": "node", 
    "id": 795319854, 
    "lat": 54.9510427, 
    "lon": -7.7218262 
}, 
{ 
    "type": "node", 
    "id": 795320324, 
    "lat": 54.9509153, 
    "lon": -7.7213706 
}, 
{ 
    "type": "node", 
    "id": 1922546572, 
    "lat": 54.9502165, 
    "lon": -7.7190169 
}, 
{ 
    "type": "node", 
    "id": 1922546679, 
    "lat": 54.9504739, 
    "lon": -7.7199078 
}, 
{ 
    "type": "node", 
    "id": 1922546692, 
    "lat": 54.9500860, 
    "lon": -7.7185174 
}, 
{ 
    "type": "node", 
    "id": 1922602861, 
    "lat": 54.9517250, 
    "lon": -7.7241644 
}, 
{ 
    "type": "node", 
    "id": 1922622063, 
    "lat": 54.9514357, 
    "lon": -7.7231690 
}, 
{ 
    "type": "node", 
    "id": 2673934802, 
    "lat": 54.9498543, 
    "lon": -7.7177617 
}, 
{ 
    "type": "way", 
    "id": 64273241, 
    "nodes": [ 
    768053039, 
    1922602861, 
    1922622063, 
    795319854, 
    795320324 
    ], 
    "tags": { 
    "highway": "secondary", 
    "maxspeed": "60", 
    "name": "Port Road", 
    "oneway": "no", 
    "ref": "R229" 
    } 
}, 
{ 
    "type": "way", 
    "id": 64887990, 
    "nodes": [ 
    795320324, 
    1922546679, 
    1922546572, 
    1922546692, 
    2673934802, 
    768053040, 
    768053041, 
    768053043, 
    768053044, 
    791492493 
    ], 
    "tags": { 
    "highway": "secondary", 
    "maxspeed": "60", 
    "name": "Port Road", 
    "oneway": "no", 
    "ref": "R229" 
    } 
} 

    ] 
} 

Код:

protected Void doInBackground(String... params) { 
      android.os.Debug.waitForDebugger(); 
      //String url_select = "http://yoururlhere.com"; 

      StringBuilder builder = new StringBuilder(); 
      HttpClient client = new DefaultHttpClient(); 
      HttpGet httpGet = new HttpGet(encode2); 

      try { 
       HttpResponse response = client.execute(httpGet); 
       StatusLine statusLine = response.getStatusLine(); 
       int statusCode = statusLine.getStatusCode(); 

       if (statusCode == 200) { 
        HttpEntity entity = response.getEntity(); 
        InputStream content = entity.getContent(); 
        BufferedReader reader = new BufferedReader(new InputStreamReader(content)); 
        String line; 

        while ((line = reader.readLine()) != null) { 

         builder.append(line); } } 
       else { 
        Log.e("==>", "Failed to download file"); } 
       } catch (ClientProtocolException e) { 
        e.printStackTrace(); 
       } catch (IOException e) { 
        e.printStackTrace(); } 
       result = builder.toString(); 
      return null; 
     } // protected Void doInBackground(String... params) 

     protected void onPostExecute(Void v) { 
      //parse JSON data 
      try { 
       JSONObject parentObject = new JSONObject(result); 

       JSONArray speedJSON = parentObject.getJSONArray("elements"); 

       JSONObject maxspeed = parentObject.getJSONObject("maxspeed"); 
       System.out.print(""+maxspeed.toString()+"\n"); 
       //String[] elementNames = JSONObject.(speedJSON); 
       System.out.printf("%d ELEMENTS IN CURRENT OBJECT:\n", speedJSON.length()); 
       for (int i = 0; i< speedJSON.length(); i++) 
       { 
        String value = speedJSON.getString(i); 
        System.out.printf("name=%s, value=%s\n", speedJSON.get(i), value); 
       } 
       //And then read attributes like  
       /* for(int i = 0; i<speedJSON.length(); i++){ 
        JSONObject child = speedJSON.getJSONObject(i); 
        if(child.getString("type").equals("way")){ 
         JSONObject tag = speedJSON.getJSONObject(i); 
         JSONObject maxspeed = tag.getJSONObject("tags"); 
         String speed = maxspeed.getString("maxspeed"); 
         txtSpeed.setText(speed); 
        } 
       }*/ 

      } catch (JSONException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
      /* try { 
       JSONArray jArray = new JSONArray(result);  
       for(int i=0; i < jArray.length(); i++) { 

        JSONObject jObject = jArray.getJSONObject(i); 

        String speedLimit = jObject.getString("maxspeed"); 
        txtSpeed.setText(speedLimit); 
       } // End Loop 

       this.progressDialog.dismiss(); 

      } catch (JSONException e) { 
       Log.e("JSONException", "Error: " + e.toString()); 
      } // catch (JSONException e) 
*/  } // protected void onPostExecute(Void v) 

    } 

ответ

0

Хорошо ваша первая проблема заключается в том, что не все JSONObjects из вашего массива "элементы" имеют свойство максимальной скорости. Вторая проблема заключается в том, что вы не выполняете правильную итерацию над своим JSONArray.

Начнёе со вторым proble:

for (int i = 0; i < speedJSON.length(); i++) { 
    JSONObject element = (JSONObject) speedJSON.get(i); 
} 

Теперь ваш элементом является JSONObject, который содержит ваши различные свойства (типа, идентификатор, Lon, ...) Чтобы решить первую проблему, то вы можете проверить, JSONObject содержит ключ, который вы ищете (MAXSPEED)

if (!element.isNull("tags") { 
    JSONObject tags = (JSONObject)element.get("tags"); 
    if (!tags.isNull("maxspeed") { 
     String maxspeed = tags.getString("maxspeed"); 
    } 
} else { 
    //Your error handling here... 
} 

Надеется, что это помогает!

+0

Благодарим за отзыв! Когда я протестировал код, он зациклился на каждом элементе массива, но не нашел «maxspeed». Должен ли я сначала получить объект «tags: way»? – user3572739

+0

О да, ладно, я забыл добавить это. Проверьте, существует ли объект тегов и получить максимальный результат от него. – Deutro

+0

что-то вроде: "для (INT I = 0; г user3572739

Смежные вопросы