Android - 如何从JSON数组中解析特定值并显示Toast

时间:2015-02-27 06:37:00

标签: java android json

一般是Android和Java的新手,我正在学习如何进行JSON调用。为此,请遵循本指南:http://mobiforge.com/design-development/consuming-json-services-android-apps

这里的事情让我感到困惑。该教程的作者希望读者调用此API:http://ws.geonames.org/findNearByWeatherJSON?lat=37lng=122

以这种格式返回JSON对象:

            {
                "weatherObservation": {
                     "clouds":"scattered clouds",
                     "weatherCondition":"n/a",
                     "observation":"KCFV 090852Z AUTO 06005KT 
                      10SM SCT090 SCT110 24/20 A3000 RMK AO2 
                      SLP148 T02390200 53002",
                     "windDirection":60,
                     "ICAO":"KCFV",
                     "seaLevelPressure":1014.8,
                     "elevation":225,
                     "countryCode":"US",
                     "lng":-95.56666666666666,
                     "temperature":"23.9",
                     "dewPoint":"20",
                     "windSpeed":"05",
                     "humidity":78,
                     "stationName":"Coffeyville, Coffeyville 
                                 Municipal Airport",
                     "datetime":"2012-07-09 08:52:00",
                     "lat":37.083333333333336
                }
            }

非常简单,除了API不再有效/有限制。为了完成项目,我选择调用此API:http://api.openweathermap.org/data/2.5/weather?lat=37.77&lon=-122.419

以此格式返回JSON

{
    "coord": {
        "lon": 139,
        "lat": 35
    },
    "sys": {
        "country": "JP",
        "sunrise": 1369769524,
        "sunset": 1369821049
    },
    "weather": [
        {
            "id": 804,
            "main": "clouds",
            "description": "overcast clouds",
            "icon": "04n"
        }
    ],
    "main": {
        "temp": 289.5,
        "humidity": 89,
        "pressure": 1013,
        "temp_min": 287.04,
        "temp_max": 292.04
    },
    "wind": {
        "speed": 7.31,
        "deg": 187.002
    },
    "rain": {
        "3h": 0
    },
    "clouds": {
        "all": 92
    },
    "dt": 1369824698,
    "id": 1851632,
    "name": "Shuzenji",
    "cod": 200
}

我可以很好地打电话,但是如何显示" main"和"描述" "天气"中的字符串阵列?更具体地说,如何将此信息显示为Toast?

以下是我所拥有的:

protected void onPostExecute(String result){

        try {


            JSONArray weatherArray = new JSONArray(result);
            JSONArray wArray = new JSONArray("weather");

            String mainWeather = wArray.getString(1);
            String mainDescription = wArray.getString(2);

            Toast.makeText(getBaseContext(), mainWeather + " - "
                        + mainDescription,Toast.LENGTH_SHORT).show();

        } catch (Exception e) {
            Log.d("ReadWeatherJSONFeedTask", e.getLocalizedMessage());
        }

因为我正在关注mobiforge教程,除了这个特殊的代码块之外,我没有偏离任何其他地方。

感谢您的帮助!

修改 这里有几个解决方案可以看到@swats和@ user3515851。由于它简单,我选择了@ remees-m-syde。主要是因为他的解决方案并不要求我通过for循环。

8 个答案:

答案 0 :(得分:5)

我使用optJSONArrayoptString代替getJSONArraygetString,因为如果该密钥没有值,“opt”将返回“”在exception

的情况下,不会抛出任何getString()

尝试以下代码

     JSONObject rootJsonObj = new JSONObject(result);
     JSONArray wArray = rootJsonObj.optJSONArray("weather");
     for (int i = 0; i < wArray.length(); i++) {
          JSONObject weatherJsonObj = wArray.optJSONObject(i);
          String mainWeather = weatherJsonObj.optString("main");
          String mainDescription = weatherJsonObj.optString("description");

          Toast.makeText(getBaseContext(), mainWeather + " - "
                      + mainDescription,Toast.LENGTH_SHORT).show();
     }

解析问题在那里,您应该从响应结果中获取对象。

编辑:使用optJSONArrayoptString时无需尝试使用catch块。

答案 1 :(得分:4)

您无法获取数据,因为“weather”JSONArray中有一个json对象。

JSONArray以 - [

开头

JSONObject以 - {,

开头

首先获取JSONArray,然后获取其中的JSONObject。

"weather": [                          ----Array
        {                             ----Object
            "id": 804,
            "main": "clouds",
            "description": "overcast clouds",
            "icon": "04n"
        }
    ]

您必须获取此JSONObject,然后从中获取String,如下面的代码所示。

    JSONObject weatherArray = new JSONObject(result);
    JSONArray wArray = weatherArray.getJSONArray("weather");
    JSONObject jobj = wArray.getJSONObject(0);
    String mainWeather = jobj.getString("main");
    String mainDescription = jobj.getString("description");
    Toast.makeText(getBaseContext(), mainWeather + " - "
                                + mainDescription,Toast.LENGTH_SHORT).show();

如果Array中有多个对象,请按以下方式获取。

JSONObject rootJsonObj = new JSONObject(result);
     JSONArray wArray = rootJsonObj.optJSONArray("weather");
     for (int i = 0; i < wArray.length(); i++) {
          JSONObject weatherJsonObj = wArray.getJSONObject(i);
          String mainWeather = weatherJsonObj.getString("main");
          String mainDescription = weatherJsonObj.getString("description");

          Toast.makeText(getBaseContext(), mainWeather + " - "
                      + mainDescription,Toast.LENGTH_SHORT).show();
     }

答案 2 :(得分:1)

protected void onPostExecute(String result){

    try {


        JSONObject weatherArray = new JSONObject(result);
        JSONArray wArray = weatherArray.getJSONArray("weather");
        for(int i=0;i<wArray.length,i++){
        JSONObject object=wArray.getJSONObject(i);
        String mainWeather=object.getString("main");
        String mainDescription=object.getString("description");
        Toast.makeText(getBaseContext(), mainWeather + " - "
                    + mainDescription,Toast.LENGTH_SHORT).show();

        }

    } catch (Exception e) {
        Log.d("ReadWeatherJSONFeedTask", e.getLocalizedMessage());
    }

我希望这个会对你有所帮助:)。

答案 3 :(得分:0)

我假设您现在通过解析此JSON来获取天气数组以从中检索值

JSONObject  object=null;
try {
            JSONObject  object=array.getJSONObject(0);
            String main=object.getString("main");  
            String description=object.getString("description");

        } catch (JSONException e) {
            e.printStackTrace();
        }

现在使用吐司中的字符串

答案 4 :(得分:0)

假设结果包含JSON,这里是如何获取main和描述形式天气:

  JSONObject resJSON = new JSONObject(result);
  JSONArray weatherArray = resJSON.getJSONArray("weather");

  for(int i = 0; i < weatherArray.length(); i++) {
      JSONObject weatherJSON = weatherArray.getJSONObject(i);
      System.out.println(weatherJSON.getString("main"));
      System.out.println(weatherJSON.getString("description"));
  }

答案 5 :(得分:0)

试试这个

    JSONObject weatherObject = new JSONObject(result);
    JSONArray wArray = weatherObject.getJSONArray("weather");
    for (int i = 0; i < wArray.length(); i++) {
      JSONObject wObject = wArray.getJSONObject(i);
      if(wObject.has("description")) {
        Log.d("TAG", wObject.getString("description"));
      }
      if(wObject.has("main")) {
        Log.d("TAG", wObject.getString("main"));
      }
    }

答案 6 :(得分:0)

最近,我发现了json2pojo json解析的有用工具,适用于任何Jackson,Gson,Java等。 希望这会对你有所帮助。

答案 7 :(得分:-1)

使用此

                JSONObject weatherArray = new JSONObject(result);
                JSONArray wArray = new JSONArray("weather");

                String mainWeather = ((JSONObject)wArray.getJSONObject(0)).getString("main");
                String mainDescription = ((JSONObject)wArray.getJSONObject(0)).getString("description");

                Toast.makeText(getBaseContext(), mainWeather + " - "
                            + mainDescription,Toast.LENGTH_SHORT).show();