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

Jackson ObjectMapper无法将JSON字符串解析为HashMap问题求解

问题解决方法

根因分析

你混淆了Jackson两个核心API的使用场景:

  • ObjectMapper.convertValue():仅用于两个已实例化的Java对象之间做类型转换,例如将一个现有POJO对象转为Map结构,不会处理JSON字符串的解析逻辑。你直接传入JSON字符串时,该方法会尝试把String实例直接转为Map,自然会抛出找不到String入参的Map构造方法的异常。
  • 解析JSON字符串为Java对象,必须使用ObjectMapper.readValue()方法。

另外你当前提供的JSON字符串存在语法错误,脱敏操作破坏了JSON结构,多处存在引号未闭合、括号不匹配的问题,需要先调整为合法的JSON格式再使用。

修正后代码

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.Map;

public class ObjectMapperDemo {

    // 请先替换为你自己的合法JSON字符串,此处为示例合法格式
    public static String applicantJson = "{\"lead_id\":null,\"finder_number\":null,\"applicant_index\":0,\"applicant_id\":100314,\"loan_application_id\":3000312,\"person\":{\"lastName\":\"[PROTECTED]\",\"firstName\":\"Cathy\",\"maternalName\":\"[PROTECTED]\"},\"phones\":[{\"phoneNumber\":\"689-165-2363\",\"phoneType\":\"HM\"},{\"phoneNumber\":\"332-621-7769\",\"phoneType\":\"CL\"}]}";

    // ObjectMapper是线程安全的,声明为静态全局变量避免重复创建浪费资源
    private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper()
            .configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true)
            // 新增配置,避免JSON存在未知属性时报错
            .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

    public static Map<String, Object> ConvertValueFromObject(Object obj) throws JsonProcessingException {
        if (obj instanceof String) {
            // 入参为JSON字符串,走readValue反序列化逻辑
            return OBJECT_MAPPER.readValue((String) obj, new TypeReference<Map<String, Object>>() {});
        } else {
            // 入参为Java对象,走convertValue类型转换逻辑
            return OBJECT_MAPPER.convertValue(obj, new TypeReference<Map<String, Object>>() {});
        }
    }

    public static void main(String[] args) throws JsonProcessingException {
        Map<String, Object> testMap = ConvertValueFromObject(applicantJson);
        System.out.println(testMap.keySet());
    }
}

额外优化建议

  • 使用TypeReference<Map<String,Object>>代替直接传入Map.class,可以避免泛型类型擦除带来的类型转换问题
  • 若你的业务场景中入参只会是JSON字符串,可直接去掉类型判断逻辑,明确使用readValue方法即可

内容的提问来源于stack exchange,提问作者Anthony Dheysum

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 11:15:02