
本文详解如何利用Jackson库将JSON字符串数组安全、高效地反序列化为List,重点解决TypeReference类型引用错误及驼峰命名映射问题,并提供可运行示例与关键注意事项。
本文详解如何利用jackson库将json字符串数组安全、高效地反序列化为list
在Java开发中,处理动态结构的JSON数据(如无固定POJO类的键值对集合)时,常需将其解析为 List
✅ 正确做法:选用兼容的Jackson版本与API
核心前提:确认使用的是 Jackson Databind(而非旧版 Codehaus Jackson)
现代项目应使用 com.fasterxml.jackson.core:jackson-databind(推荐 2.15+),而非已废弃的 org.codehaus.jackson。后者已于2013年停止维护,其 ObjectMapper 不支持 TypeReference 的泛型反序列化方法重载。
✅ 正确导入(Maven依赖):
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.15.3</version>
</dependency>✅ 正确代码实现(无需自定义CamelCaseHashMap类):
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.*;
public class JsonToListHashMap {
public static void main(String[] args) throws Exception {
String json = "[{\"alarmCount\":\"192\",\"sensorId\":\"CM07000071\"},{\"alarmCount\":\"192\",\"sensorId\":\"CM07000072\"}]";
ObjectMapper mapper = new ObjectMapper();
// 直接反序列化为 List<Map<String, String>> —— 简洁、安全、标准
List<Map<String, String>> data = mapper.readValue(
json,
new TypeReference<List<Map<String, String>>>() {}
);
// 验证结果
for (Map<String, String> item : data) {
System.out.println("sensorId: " + item.get("sensorId")
+ ", alarmCount: " + item.get("alarmCount"));
}
// 输出:
// sensorId: CM07000071, alarmCount: 192
// sensorId: CM07000072, alarmCount: 192
}
}? 如需自动下划线转驼峰(如 alarm_count → alarmCount)
若原始JSON字段为蛇形命名(如 {"alarm_count":"192"}),而你希望在Map中以驼峰形式访问键,则不建议继承HashMap重写put()(易引发并发/序列化问题,且Jackson默认不调用自定义put)。推荐以下两种专业方案:
立即学习“Java免费学习笔记(深入)”;
方案1:配置ObjectMapper全局启用蛇形转驼峰(推荐)
ObjectMapper mapper = new ObjectMapper();
// 启用自动将下划线分隔键转为驼峰键(仅影响Map反序列化)
mapper.setPropertyNamingStrategy(PropertyNamingStrategies.SNAKE_CASE);
List<Map<String, String>> data = mapper.readValue(json,
new TypeReference<List<Map<String, String>>>() {});
// 此时即使JSON是 {"alarm_count":"192"},map.get("alarmCount") 也能返回值方案2:使用@JsonAlias或自定义KeyDeserializer(适用于复杂场景)
⚠️ 关键注意事项
- 禁止使用org.codehaus.jackson:该包的ObjectMapper无readValue(String, TypeReference)签名,强制使用会导致编译失败;
-
TypeReference必须匿名子类化:new TypeReference
- >>() {} 中的 {} 不可省略,否则类型信息丢失;
- 避免继承HashMap做运行时转换:CamelCaseHashMap在Jackson反序列化过程中不会被调用其put()方法;Jackson直接操作内部哈希表,绕过自定义逻辑;
-
类型安全建议:优先使用 Map
接收,再按需转换值类型(如String.valueOf(map.get("alarmCount"))),以兼容数字/布尔等混合类型; - 异常处理:生产环境务必捕获 JsonProcessingException 和 IOException。
✅ 总结
将JSON数组转为List










