You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中JsonArray转List<HashMap>报错,求解决方法

解决Jackson转换JSON数组到List的报错问题

报错原因分析

你遇到的编译错误是因为当前使用的ObjectMapper没有匹配的readValue重载方法,大概率是以下两种情况:

  • 导入了错误的TypeReference类(比如旧版codehaus的Jackson包)
  • 使用的Jackson版本过旧,不支持TypeReference作为参数的重载方法

解决方案

方案1:确保导入正确的Jackson包和类

  1. 确认项目依赖的是FasterXML Jackson(当前主流版本),而非旧的Codehaus Jackson。Maven依赖示例:
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.15.2</version> <!-- 使用最新稳定版 -->
</dependency>
  1. 导入正确的类:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 05:16:23