Java中JsonArray转List<HashMap>报错,求解决方法
解决Jackson转换JSON数组到List的报错问题
报错原因分析
你遇到的编译错误是因为当前使用的ObjectMapper没有匹配的readValue重载方法,大概率是以下两种情况:
- 导入了错误的
TypeReference类(比如旧版codehaus的Jackson包) - 使用的Jackson版本过旧,不支持
TypeReference作为参数的重载方法
解决方案
方案1:确保导入正确的Jackson包和类
- 确认项目依赖的是FasterXML Jackson(当前主流版本),而非旧的Codehaus Jackson。Maven依赖示例:
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.15.2</version> <!-- 使用最新稳定版 --> </dependency>
- 导入正确的类:
import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper;
方案2:使用TypeFactory替代TypeReference
如果仍存在参数匹配问题,可通过ObjectMapper的TypeFactory构造集合类型:
ObjectMapper mapper = new ObjectMapper(); List<CamelCaseHashMap> data = mapper.readValue( json, mapper.getTypeFactory().constructCollectionType(List.class, CamelCaseHashMap.class) );
方案3:优化CamelCaseHashMap的实现(可选)
你的CamelCaseHashMap仅重写了put方法,但Jackson反序列化时可能调用putAll等批量插入方法,导致键名未被转换。建议补充重写putAll:
@Override public void putAll(Map<? extends String, ?> m) { for (Entry<? extends String, ?> entry : m.entrySet()) { String camelCaseKey = JdbcUtils.convertUnderscoreNameToPropertyName(entry.getKey()); super.put(camelCaseKey, entry.getValue()); } }
另外,若你的JSON键已是驼峰格式(如alarmCount),convertUnderscoreNameToPropertyName不会改变键名,可直接用普通HashMap;若需处理下划线键的JSON,配置Jackson命名策略更简洁:
ObjectMapper mapper = new ObjectMapper(); mapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE); List<HashMap<String, Object>> data = mapper.readValue(json, new TypeReference<List<HashMap<String, Object>>>(){});
验证代码
修改后的完整示例:
import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import java.util.List; import java.util.Map; import java.util.HashMap; import java.util.Map.Entry; public class JsonTest { public static void main(String[] args) throws Exception { String json = "[{\"alarmCount\":\"192\",\"sensorId\":\"CM07000071\"},{\"alarmCount\":\"192\",\"sensorId\":\"CM07000072\"}]"; ObjectMapper mapper = new ObjectMapper(); List<CamelCaseHashMap> data = mapper.readValue(json, new TypeReference<List<CamelCaseHashMap>>(){}); // 打印结果验证 for (CamelCaseHashMap map : data) { System.out.println(map); } } } class CamelCaseHashMap extends HashMap<String, Object> { @Override public Object put(String key, Object value) { return super.put(JdbcUtils.convertUnderscoreNameToPropertyName(key), value); } @Override public void putAll(Map<? extends String, ?> m) { for (Entry<? extends String, ?> entry : m.entrySet()) { String camelCaseKey = JdbcUtils.convertUnderscoreNameToPropertyName(entry.getKey()); super.put(camelCaseKey, entry.getValue()); } } }
内容的提问来源于stack exchange,提问作者hi-inbeom
相关产品推荐
相关产品推荐

