
本文详解使用 Jackson 将 JSON 数组反序列化为 List 的正确方法,重点解决 TypeReference 类型推导错误、键名自动驼峰转换及兼容性问题,并提供可直接运行的完整示例。
本文详解使用 jackson 将 json 数组反序列化为 `list
在 Java 开发中,常需将前端传来的 JSON 数组(如传感器告警数据)解析为内存中的 List
The method readValue(String, Class<T>) in the type ObjectMapper is not applicable for the arguments (String, TypeReference<List<CamelCaseHashMap>>)
该错误通常源于 Jackson 版本混用 或 导入包错误 —— 旧版 org.codehaus.jackson.*(Jackson 1.x)与新版 com.fasterxml.jackson.databind.*(Jackson 2.x)的 API 不兼容。
✅ 正确做法(推荐 Jackson 2.x,当前主流):
-
引入正确依赖(Maven):
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.15.3</version> <!-- 建议使用最新稳定版 --> </dependency>
-
定义键名转换的 CamelCaseHashMap(继承 HashMap,重写 put):
import java.util.HashMap;
public static class CamelCaseHashMap extends HashMap
private static String convertUnderscoreToCamelCase(String underscore) {
if (underscore == null || underscore.isEmpty()) return underscore;
StringBuilder result = new StringBuilder();
boolean nextUpperCase = false;
for (int i = 0; i < underscore.length(); i++) {
char c = underscore.charAt(i);
if (c == '_') {
nextUpperCase = true;
} else {
if (nextUpperCase) {
result.append(Character.toUpperCase(c));
nextUpperCase = false;
} else {
result.append(Character.toLowerCase(c));
}
}
}
return result.toString();
}}
3. **使用 `TypeReference` 安全反序列化**(关键:必须用 `com.fasterxml.jackson.core.type.TypeReference`):
```java
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.core.type.TypeReference;
public class JsonToListHashMapExample {
public static void main(String[] args) throws Exception {
String json = "[{\"alarm_count\":\"192\",\"sensor_id\":\"CM07000071\"},{\"alarm_count\":\"192\",\"sensor_id\":\"CM07000072\"}]";
ObjectMapper mapper = new ObjectMapper();
List<CamelCaseHashMap> dataList = mapper.readValue(
json,
new TypeReference<List<CamelCaseHashMap>>() {} // 注意:此处必须是匿名内部类语法,不可省略 {}
);
// 验证结果
for (CamelCaseHashMap item : dataList) {
System.out.println("alarmCount: " + item.get("alarmCount")); // 输出: 192
System.out.println("sensorId: " + item.get("sensorId")); // 输出: CM07000071 / CM07000072
}
}
}⚠️ 重要注意事项:
- 切勿混用 Jackson 1.x 与 2.x 包:org.codehaus.jackson.* 已废弃,com.fasterxml.jackson.* 是唯一维护版本;
- TypeReference 必须以匿名子类形式传入(即 new TypeReference<...>() {}),否则类型擦除会导致反序列化失败;
- 若原始 JSON 键已是驼峰(如 "alarmCount"),则无需 CamelCaseHashMap,可直接用 List
- 如需强类型(如 List
),建议定义 POJO 并配合 @JsonProperty 注解,比 HashMap 更安全、易维护。
? 进阶建议:对于高频转换场景,可封装通用工具方法:
public static <T> List<T> jsonToList(String json, Class<T> elementType) throws JsonProcessingException {
return new ObjectMapper().readValue(json, new TypeReference<List<T>>() {});
}但注意:此方法仅适用于 T 为具体类(如 SensorData.class),不适用于泛型 HashMap 子类——此时仍需 TypeReference。
通过以上方案,即可健壮、清晰地完成 JSON 数组 → List










