首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java JSON 反序列化進階:json-lib 處理多層巢狀 List 的實戰技巧

     編輯:Java 相關知識

依賴準備

<dependency>
    <groupId>net.sf.json-lib</groupId>
    <artifactId>json-lib</artifactId>
    2.4
    jdk15
</dependency>
<!-- 必須傳遞依賴 -->
<dependency><groupId>commons-beanutils</groupId><artifactId>commons-beanutils</artifactId><version>1.9.4</version></dependency>
<dependency><groupId>commons-collections</groupId><artifactId>commons-collections</artifactId><version>3.2.2</version></dependency>
<dependency><groupId>commons-lang</groupId><artifactId>commons-lang</artifactId><version>2.6</version></dependency>
<dependency><groupId>net.sf.ezmorph</groupId><artifactId>ezmorph</artifactId><version>1.0.6</version></dependency>

核心技巧:classMap 映射泛型集合

JSON 結構:

{
  "results": [
    {
      "currentCity": "南京",
      "index": [ { "title": "穿衣", ... }, ... ],
      "weather_data": [ { "date": "周四", ... }, ... ]
    }
  ]
}

Java Bean 對應:

class WeatherBean_Baidu {
    List results;
}
class WeatherBean_Baidu_City {
    List index;
    List weather_data;
}

反序列化代碼

JSONObject jsonObj = JSONObject.fromObject(jsonStr);

Map classMap = new HashMap<>();
classMap.put("results", WeatherBean_Baidu_City.class);           // 頂層 List 泛型
classMap.put("index", WeatherBean_Baidu_City_Index.class);       // 二層 List 泛型
classMap.put("weather_data", WeatherBean_Baidu_City_Weatherdata.class); // 三層

WeatherBean_Baidu weather = (WeatherBean_Baidu) JSONObject.toBean(
    jsonObj, WeatherBean_Baidu.class, classMap);

關鍵點解析

  1. classMap 的 key:JSON 中對應 List 的字段名(如 "results"、"index")
  2. classMap 的 value:List 泛型的實際類型(非 List.class)
  3. 多層嵌套:只要在 classMap 中把所有層級的 List 字段都聲明,遞歸自動完成
  4. Bean 要求:必須有無參構造器、標準 getter/setter、字段名與 JSON key 一致(或用 @JSONField)

完整 Bean 定義範例

@SuppressWarnings("serial")
public class WeatherBean_Baidu_City_Weatherdata implements Serializable {
    private String date, dayPictureUrl, nightPictureUrl, weather, wind, temperature;
    // 全部 getter/setter 省略...
}

避坑指南

問題原因解決
List 字段為 nullclassMap 缺少該字段映射補全 classMap
ClassCastExceptionJSON 結構與 Bean 不匹配(如對象 vs 數組)檢查 JSON 結構,調整 Bean 字段類型
日期/枚舉解析失敗默認轉換器不支持註冊自定義 JsonValueProcessor / JsonBeanProcessor
性能差json-lib 基於反射,較慢大數據量場景遷移 Jackson/Gson

現代替代方案推薦

新項目建議直接使用 Jackson 或 Gson,原生支持泛型類型引用(TypeReference / TypeToken),無需 classMap,性能更強:

// Jackson
ObjectMapper mapper = new ObjectMapper();
WeatherBean_Baidu weather = mapper.readValue(jsonStr,
    new TypeReference() {});

// Gson
Gson gson = new Gson();
WeatherBean_Baidu weather = gson.fromJson(jsonStr, WeatherBean_Baidu.class);
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved