JSON数组不返回数据

时间:2015-07-26 19:57:14

标签: android json jsonobject

我有这个JSON数据,我有问题为我的天气应用程序提取数据。我得到JSONexception,我不知道为什么

{
  "city": {
    "id": 792680,
    "name": "Belgrade",
    "coord": {
      "lon": 20.46513,
      "lat": 44.804008
    },
    "country": "RS",
    "population": 0,
    "sys": {
      "population": 0
    }
  },
  "cod": "200",
  "message": 0.0106,
  "cnt": 9,
  "list": [
    {
      "dt": 1437944400,
      "main": {
        "temp": 17.99,
        "temp_min": 17.99,
        "temp_max": 20.44,
        "pressure": 1013.8,
        "sea_level": 1024.97,
        "grnd_level": 1013.8,
        "humidity": 60,
        "temp_kf": -2.45
      },
      "weather": [
        {
          "id": 800,
          "main": "Clear",
          "description": "sky is clear",
          "icon": "01n"
        }
      ],
      "clouds": {
        "all": 0
      },
      "wind": {
        "speed": 2.41,
        "deg": 347
      },
      "rain": {
        
      },
      "sys": {
        "pod": "n"
      },
      "dt_txt": "2015-07-26 21:00:00"
    },

我的提取方法看起来像这样。

private void renderWeather(JSONObject json) {
    try {

        String precipitation = "N/A";

        JSONArray listObjects = json.getJSONArray("list");
        for (int i = 0; i < listObjects.length(); i++) {
            JSONObject JSONobj1 = listObjects.getJSONObject(i);

            DateFormat df = DateFormat.getDateTimeInstance();
            String time = df.format(new Date(json.getLong("dt") * 1000));

            if (JSONobj1.getJSONObject("rain").length() != 0) {
                precipitation = JSONobj1.getJSONObject("rain").getString("3h");
            }

            String temperature = JSONobj1.getJSONObject("main").getString("temp");

            int weatherIconId = JSONobj1.getJSONArray("weather").getJSONObject(0).getInt("id");

            HourlyForecast hourlyForecast = new HourlyForecast(time, precipitation, temperature, weatherIconId);
            hourlyForecastArrayList.add(hourlyForecast);


        }
    } catch (Exception e) {
        Log.e("SimpleWeather", "One or more fields not found in the JSON data");
        Toast.makeText(getActivity(), "No JSON data found", Toast.LENGTH_LONG).show();
    }
}

这是例外。

 org.json.JSONException: No value for dt
        at org.json.JSONObject.get(JSONObject.java:354)
        at org.json.JSONObject.getLong(JSONObject.java:477)
        at com.slobx.slobodan.weathermob.Tab3.renderWeather(Tab3.java:107)
        at com.slobx.slobodan.weathermob.Tab3.access$000(Tab3.java:31)
        at com.slobx.slobodan.weathermob.Tab3$1$2.run(Tab3.java:89)
        at android.os.Handler.handleCallback(Handler.java:615)
        at android.os.Handler.dispatchMessage(Handler.java:92)
        at android.os.Looper.loop(Looper.java:137)
        at android.app.ActivityThread.main(ActivityThread.java:4745)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:511)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
        at dalvik.system.NativeStart.main(Native Method)

在这一行

String time = df.format(new Date(json.getLong("dt") * 1000));

感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

这是因为您使用json.getString(" dt")代替JSONobj1.getString("dt")

答案 1 :(得分:0)

list数组的某些位置可能没有定义dt属性。

在使用这些值之前,请确保它们是否存在使用json.isNull("dt")或使用optString()等。这些方法不会抛出任何异常,而是返回null或0。

答案 2 :(得分:0)

我建议使用Gson library。 Gson让这种东西变得非常容易。

您需要做的就是为json文件中的每个Json对象定义POJO。您不需要编写任何代码来转换为JsonObject / JsonArray,Gson会为您处理。

POJO类应该使用与json键相同的名称定义,并使用适当的数据类型(您的json结构可能使用一些重构)。

class CityInfo {
    City city;
    String cod;
    double message;
    int cnt;
    List<Info> list;
}

class City {
    int id, population;
    String name, country;
    Coord coord;
    Sys sys;
}

class Coord {
    double lon, lat;
}

class Sys {
    int population;
}

class Info {
    long dt;
    String dt_text;
    Main main;
    Weather weather;
    Clouds clouds;
    Wind wind;
    Rain rain;
    Sys2 sys;
}

class Main {
    double temp, tempMin, tempMax, pressure, seaLevel, grndLevel, humidity, tempKf;
}

class Weather {
    int id;
    String main, description, icon;
}

class Clouds {
   int all;
}

class Wind {
    double speed;
    int deg;
}

class Rain{}

class Sys2 {
    String pod;
}

一旦您正确定义了POJO,您就可以在json-string&lt; - &gt;之间进行转换。 POJO是这样的:

// Build a gson object responsible for conversion and set naming convention
Gson gson = new GsonBuilder()
    .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
    .create()

// Convert from json-string to POJO
BufferedReader br = new BufferedReader(new FileReader("file.json"));
CityInfo cityInfo = gson.fromJson(br, CityInfo.class);

// Convert from POJO to json-string
String json = gson.toJson(cityInfo);