Java中使用JSONObject将JSON字符串转换为含多层List的对象

Owen
Owen
发布时间:2026-10-13 | 5人浏览过
原创

在Java开发中,处理包含多层嵌套结构的JSON字符串(如城市列表中嵌套的天气指数和预报数据)时,手动解析往往繁琐易错。本文将演示如何利用成熟的json-lib库中的JSONObject,结合类映射配置,一键将复杂JSON直接转换为对应的Java Bean对象,实现高效的数据提取。

准备环境与依赖配置

要实现JSON到Java对象的自动转换,核心依赖于 json-lib 框架。在使用前,需确保项目中已导入以下JAR包:

  • json-lib-2.2-jdk15.jar(核心库)
  • commons-beanutils.jar
  • commons-httpclient.jar
  • commons-lang.jar
  • ezmorph.jar
  • morph-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数据处理技巧的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表