Java中使用JSONObject将JSON字符串转换为含多层List的对象
在Java开发中,处理包含多层嵌套结构的JSON字符串(如城市列表中嵌套的天气指数和预报数据)时,手动解析往往繁琐易错。本文将演示如何利用成熟的json-lib库中的JSONObject,结合类映射配置,一键将复杂JSON直接转换为对应的Java Bean对象,实现高效的数据提取。
准备环境与依赖配置
要实现JSON到Java对象的自动转换,核心依赖于 json-lib 框架。在使用前,需确保项目中已导入以下JAR包:
json-lib-2.2-jdk15.jar(核心库)commons-beanutils.jarcommons-httpclient.jarcommons-lang.jarezmorph.jarmorph-1.0.1.jar
这些依赖包是JSON-lib能够正确反射和操作Bean属性的基础。
真实操作顺序:构建多层嵌套Bean
为了解析如下格式的复杂JSON数据,我们需要定义对应的Java实体类。由于JSON中包含results这一外层List,以及内部嵌套的index和weather_data列表,因此需要建立层级分明的Bean结构。
第1步:定义顶层容器对象 (WeatherBean_Baidu)
该对象对应根节点,包含状态码、日期以及一个List类型的results字段。
package com.lenovo.conference.entity.vo;
import java.io.Serializable;
import java.util.List;
@SuppressWarnings("serial")
public class WeatherBean_Baidu implements Serializable {
private String error;
private String status;
private String date;
// 关键:这里存储城市信息的列表
private List<WeatherBean_Baidu_City> results;
// Getter 和 Setter 省略...
public List<WeatherBean_Baidu_City> getResults() { return results; }
public void setResults(List<WeatherBean_Baidu_City> results) { this.results = results; }
}
第2步:定义第二层对象 (WeatherBean_Baidu_City)
代表单个城市的数据,包含城市名、PM2.5值,以及两个子列表:index(生活指数)和weather_data(每日天气详情)。
package com.lenovo.conference.entity.vo;
import java.io.Serializable;
import java.util.List;
@SuppressWarnings("serial")
public class WeatherBean_Baidu_City implements Serializable {
private String currentCity;
private String pm25;
// 嵌套的生活指数列表
private List<WeatherBean_Baidu_City_Index> index;
// 嵌套的天气数据列表
private List<WeatherBean_Baidu_City_Weatherdata> weather_data;
// Getter 和 Setter 省略...
public List<WeatherBean_Baidu_City_Index> getIndex() { return index; }
public void setIndex(List<WeatherBean_Baidu_City_Index> index) { this.index = index; }
public List<WeatherBean_Baidu_City_Weatherdata> getWeather_data() { return weather_data; }
public void setWeather_data(List<WeatherBean_Baidu_City_Weatherdata> weather_data) { this.weather_data = weather_data; }
}
第3步:定义第三层具体信息对象 (WeatherData & Index)
分别定义生活指数的详细信息(标题、建议等)和每日天气预报的详细信息(温度、风向、图片链接等)。
// 天气数据详情Bean
public class WeatherBean_Baidu_City_Weatherdata implements Serializable {
private String date; // 日期
private String dayPictureUrl; // 白天天气图URL
private String nightPictureUrl;// 晚上天气图URL
private String weather; // 天气状况
private String wind; // 风向风力
private String temperature; // 温度范围
// ... getter/setter methods
}
// 生活指数详情Bean
public class WeatherBean_Baidu_City_Index implements Serializable {
private String title; // 指数名称
private String zs; // 等级描述
private String tipt; // 指数提示简述
private String des; // 详细描述
// ... getter/setter methods
}
执行转换操作
定义好所有层级后,即可使用JSONObject进行转换。关键在于当存在自定义类型或List集合时,必须提供类映射表(Map)以指导转换。
String jsonStrBody = "{...}"; // 此处填入完整的JSON字符串
// 1. 将JSON字符串转换为 JSONObject 对象
JSONObject jsonObj = JSONObject.fromObject(jsonStrBody);
// 2. 配置类映射表
// 注意:key 必须与 JSON 字符串中的 Key 完全一致
Map<String, Class> classMap = new HashMap<String, Class>();
classMap.put("results", WeatherBean_Baidu_City.class);
classMap.put("index", WeatherBean_Baidu_City_Index.class);
classMap.put("weather_data", WeatherBean_Baidu_City_Weatherdata.class);
// 3. 执行转换并输出结果
// 第一个参数:顶层 Bean Class;第二个参数:配置好的 Map
WeatherBean_Baidu weather = (WeatherBean_Baidu) JSONObject.toBean(
jsonObj,
WeatherBean_Baidu.class,
classMap
);
System.out.println(weather.getResults());
测试用JSON样例
以下为上述代码所解析的结构化JSON数据样例,包含了两个城市(南京、徐州)的多日天气及指数信息,可用于验证转换结果:
{
"error": 0,
"status": "success",
"date": "2015-01-15",
"results": [
{
"currentCity": "南京",
"pm25": "83",
"index": [...], // 指数列表
"weather_data": [...] // 天气数据列表
},
{
"currentCity": "徐州",
"pm25": "154",
"index": [...],
"weather_data": [...]
}
]
}
完成判断
如果转换成功,打印出的weather.getResults()将返回一个包含WeatherBean_Baidu_City对象的List。您可以遍历该List,进一步获取每个城市的getIndex()(生活指数)和getWeather_data()(每日详情),从而实现对深层JSON数据的无缝访问。
以上就是Java中Json字符串直接转换为对象的方法(包括多层List集合)的详细内容,更多关于Java JSON数据处理技巧的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













