我有这个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));
感谢您的帮助。
答案 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);