从JSON文件中的嵌套对象中检索字符串|| Android的

时间:2015-03-16 14:27:18

标签: java android json parsing openstreetmap

我在尝试访问JSON文件中的某些值时遇到问题。 该文件有多个对象存储在数组中。

我需要返回的价值是" 60"在" maxspeed"内串。 当在调试中执行当前代码时,它只是保持循环。*不确定为什么)

"结果的价值" string是整个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)

    }

1 个答案:

答案 0 :(得分:0)

好的第一个问题是,并非所有“elements”数组中的JSONObject都具有最大速度属性。第二个问题是你没有正确迭代你的JSONArray。

让我们从第二个问题开始:

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

现在你的元素是JSONObject,它包含你的不同属性(type,id,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...
}

希望这有帮助!