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
相关产品推荐
相关产品推荐

