Java解決Jackson反序列化字段名不匹配問題
在 Java 開發(fā)XML中,我們經(jīng)常使用 Jackson 庫來處理 JSON 數(shù)據(jù)的序列化和反序列化。然而,在實際開發(fā)中,由于 JSON 和 Java 對象的字段命名風(fēng)格不一致(如大小寫、is 前綴等),經(jīng)常會出現(xiàn) UnrecognizedPropertyException 錯誤。本文將結(jié)合一個實際案例,分析常見的字段名不匹配問題,并提供多種解決方案,幫助開發(fā)者高效應(yīng)對類似問題。
問題背景
假設(shè)我們有一個 JSON 數(shù)據(jù),結(jié)構(gòu)如下:
{
"id": null,
"msg": null,
"isSuccess": true,
"code": null,
"data": {
"Total": 1700,
"Rows": [...]
}
}對應(yīng)的 Java 類 ExamListResponseVo 定義如下:
@Data
public class ExamListResponseVo {
private Object id;
private String msg;
private boolean isSuccess; // 問題1:Jackson 默認(rèn)會去掉 is 前綴
private Object code;
private ExamListData data;
@Data
public static class ExamListData {
private Integer total; // 問題2:JSON 中是 "Total",大小寫不匹配
private List<ExamRow> rows;
}
}當(dāng)我們使用 ObjectMapper 反序列化時,可能會遇到以下兩個錯誤:
error:Unrecognized field "isSuccess"
原因:isSuccess 在 JSON 中是 isSuccess,但 Jackson 默認(rèn)會去掉 is 前綴,嘗試匹配 success。
error:Unrecognized field "Total"
原因:JSON 中的 "Total" 是首字母大寫,而 Java 類中是 total,大小寫不匹配。
解決方案
1. 解決isSuccess問題
方案 1:修改 Java 字段名(推薦)
private boolean success; // 改為 success,與 Jackson 默認(rèn)行為一致
方案 2:使用@JsonProperty注解
@JsonProperty("isSuccess") // 強制匹配 JSON 中的 isSuccess
private boolean isSuccess;方案 3:配置ObjectMapper禁用is前綴處理
ObjectMapper mapper = new ObjectMapper(); mapper.configure(MapperFeature.USE_STD_BEAN_NAMING, true); // 禁止自動去掉 is 前綴
2. 解決Total大小寫問題
方案 1:修改 Java 字段名(推薦)
private Integer Total; // 與 JSON 完全一致
方案 2:使用@JsonProperty注解
@JsonProperty("Total")
private Integer total;方案 3:配置ObjectMapper忽略大小寫
ObjectMapper mapper = new ObjectMapper(); mapper.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true);
方案 4:忽略未知字段(適用于不可控 JSON 結(jié)構(gòu))
@Data
@JsonIgnoreProperties(ignoreUnknown = true) // 忽略 JSON 中多余的字段
public static class ExamListData {
private Integer total;
private List<ExamRow> rows;
}最佳實踐
1. 保持 JSON 和 Java 字段名一致
如果 JSON 可控,建議統(tǒng)一命名風(fēng)格,如全部使用
snake_case或camelCase。
2. 優(yōu)先使用@JsonProperty注解
適用于需要保留原有 Java 字段名但 JSON 字段名不同的情況。
3. 全局配置ObjectMapper
如果項目中有大量大小寫不一致的情況,可以全局配置:
ObjectMapper mapper = new ObjectMapper(); mapper.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true); mapper.configure(MapperFeature.USE_STD_BEAN_NAMING, true);
4. 使用@JsonIgnoreProperties避免未知字段報錯
適用于第三方 API 返回的 JSON 結(jié)構(gòu)可能變化的情況。
完整代碼示例
修正后的ExamListResponseVo
@Data
@JsonIgnoreProperties(ignoreUnknown = true) // 可選:忽略未知字段
public class ExamListResponseVo {
private Object id;
private String msg;
@JsonProperty("isSuccess") // 顯式指定 JSON 字段名
private boolean isSuccess;
private Object code;
private ExamListData data;
@Data
public static class ExamListData {
@JsonProperty("Total") // 顯式指定 JSON 字段名
private Integer total;
private List<ExamRow> rows;
}
}反序列化代碼
ObjectMapper mapper = new ObjectMapper(); // 可選:全局配置 // mapper.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true); String responseBody = "..."; // JSON 字符串 ExamListResponseVo result = mapper.readValue(responseBody, ExamListResponseVo.class);
總結(jié)
| 問題 | 解決方案 | 適用場景 |
|---|---|---|
| isSuccess 不匹配 | 修改字段名 / @JsonProperty | 布爾字段帶 is 前綴 |
| Total 大小寫問題 | 修改字段名 / @JsonProperty / 全局配置 | JSON 字段名大小寫不一致 |
| 未知字段報錯 | @JsonIgnoreProperties | 第三方 API 返回不可控 JSON |
推薦做法:
- 盡量統(tǒng)一 JSON 和 Java 字段名(如 camelCase)。
- 必要時使用 @JsonProperty 顯式映射。
- 全局配置 ObjectMapper 適用于大型項目。
- 使用 @JsonIgnoreProperties 增強魯棒性。
通過本文的解決方案,你可以輕松應(yīng)對 Jackson 反序列化時的字段名不匹配問題,提高開發(fā)效率!
到此這篇關(guān)于Java解決Jackson反序列化字段名不匹配問題的文章就介紹到這了,更多相關(guān)Java Jackson反序列化字段名不匹配內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java內(nèi)存模型(JMM)及happens-before原理
這篇文章主要介紹了java內(nèi)存模型(JMM)及happens-before原理,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-04-04
spring cloud gateway整合sentinel實現(xiàn)網(wǎng)關(guān)限流
這篇文章主要介紹了spring cloud gateway整合sentinel實現(xiàn)網(wǎng)關(guān)限流,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-01-01
淺談springboot中tk.mapper代碼生成器的用法說明
這篇文章主要介紹了淺談springboot中tk.mapper代碼生成器的用法說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-09-09

