JSON 数组未返回数据
JSON Array not returning data
我有这个 JSON 数据,但我在为我的天气应用程序提取数据时遇到问题。我收到 JSON 异常,我不知道为什么
{
"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[=13=]0(Tab3.java:31)
at com.slobx.slobodan.weathermob.Tab3.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));
感谢您的帮助。
可能 list
数组的某些位置可能没有 dt
属性 定义。
在使用这些值之前,使用 json.isNull("dt")
或使用 optString() 等确保它们是否存在。这些方法不会抛出任何异常,而是 return null 或 0。
这是因为您使用 json.getString(" dt")
而不是 JSONobj1.getString("dt")
我建议使用 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 <-> 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);
我有这个 JSON 数据,但我在为我的天气应用程序提取数据时遇到问题。我收到 JSON 异常,我不知道为什么
{
"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[=13=]0(Tab3.java:31)
at com.slobx.slobodan.weathermob.Tab3.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));
感谢您的帮助。
可能 list
数组的某些位置可能没有 dt
属性 定义。
在使用这些值之前,使用 json.isNull("dt")
或使用 optString() 等确保它们是否存在。这些方法不会抛出任何异常,而是 return null 或 0。
这是因为您使用 json.getString(" dt")
而不是 JSONobj1.getString("dt")
我建议使用 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 <-> 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);