<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>
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); MapclassMap = 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);
@SuppressWarnings("serial")
public class WeatherBean_Baidu_City_Weatherdata implements Serializable {
private String date, dayPictureUrl, nightPictureUrl, weather, wind, temperature;
// 全部 getter/setter 省略...
}
| 問題 | 原因 | 解決 |
|---|---|---|
| List 字段為 null | classMap 缺少該字段映射 | 補全 classMap |
| ClassCastException | JSON 結構與 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);