【问题标题】:Jackson ObjectMapper not able to parse string as hashmapJackson ObjectMapper 无法将字符串解析为哈希图
【发布时间】:2021-10-14 23:02:15
【问题描述】:

我想将 Json 字符串解析为 Map 并在现有应用程序中使用它。

import java.util.Map;
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 com.fasterxml.jackson.databind.JsonNode;

public class ObjectMapperDemo {

    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],\\\"middleName\\\":\\\"Kimberly\\\",\\\"dateOfBirth[PROTECTED],\\\"ssn[PROTECTED],\\\"itin[PROTECTED],\\\"last4Ssn[PROTECTED],\\\"last4Itin[PROTECTED],\\\"oktaId\\\":null,\\\"suffix\\\":\\\"Sr\\\",\\\"title\\\":null,\\\"clientId\\\":null,\\\"sipClientId\\\":null,\\\"customerId\\\":null,\\\"inUSSince\\\":null},\\\"email\\\":[{\\\"home\\\":\\\"SwNjh67784@oportun.com\\\"}],\\\"address[PROTECTED],\\\"street[PROTECTED],\\\"street[PROTECTED],\\\"city[PROTECTED],\\\"state\\\":\\\"FL\\\",\\\"postalCode\\\":\\\"33144\\\"}],\\\"identification[PROTECTED],\\\"number[PROTECTED],\\\"expirationDate\\\":\\\"2023-02-02T00:00:00.000Z\\\",\\\"dateOfBirth[PROTECTED],\\\"firstName\\\":\\\"Cathy\\\",\\\"middleName\\\":\\\"Kimberly\\\",\\\"lastName[PROTECTED],\\\"maternalName[PROTECTED],\\\"suffix\\\":\\\"Sr\\\",\\\"issuingCountry\\\":\\\"US\\\",\\\"issuingState\\\":\\\"CA\\\",\\\"issuingCity[PROTECTED],\\\"issueDate\\\":null,\\\"street[PROTECTED],\\\"street[PROTECTED],\\\"postalCode\\\":\\\"94063\\\",\\\"city[PROTECTED],\\\"state\\\":\\\"CA\\\",\\\"country\\\":null}],\\\"phones\\\":[{\\\"phoneNumber\\\":\\\"689-165-2363\\\",\\\"phoneType\\\":\\\"HM\\\"},{\\\"phoneNumber\\\":\\\"332-621-7769\\\",\\\"phoneType\\\":\\\"CL\\\"}]}";

    public static Map<String, Object> ConvertValueFromObject(Object obj) {

        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY);
        objectMapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);
        return objectMapper.convertValue(obj, Map.class);

    }

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

    }

}

抛出的stacktrace如下:

Exception in thread "main" java.lang.IllegalArgumentException: Cannot construct instance of `java.util.LinkedHashMap` (although at least one Creator exists): no String-argument constructor/factory method to deserialize from String value ('{\"lead_id\":null,\"finder_number\":null,\"applicant_index\":0,\"applicant_id\":100314,\"loan_application_id\":3000312,\"person\":{\"lastName[PROTECTED],\"firstName\":\"Cathy\",\"maternalName[PROTECTED],\"middleName\":\"Kimberly\",\"dateOfBirth[PROTECTED],\"ssn[PROTECTED],\"itin[PROTECTED],\"last4Ssn[PROTECTED],\"last4Itin[PROTECTED],\"oktaId\":null,\"suffix\":\"Sr\",\"title\":null,\"clientId\":null,\"sipClientId\":null,\"customerId\":null,\"inUSSince\":null},\"email\":[{\"home\":\"SwNjh67784@oportun.com\"}],\"address[PROTECTED],\"street[PROTECTED],\"street[PROTECTED],\"city[PROTECTED],\"state\":\"FL\",\"postalCode\":\"33144\"}],\"identification[PROTECTED],\"number[PROTECTED],\"expirationDate\":\"2023-02-02T00:00:00.000Z\",\"dateOfBirth[PROTECTED],\"firstName\":\"Cathy\",\"middleName\":\"Kimberly\",\"lastName[PROTECTED],\"maternalName[PROTECTED],\"suffix\":\"Sr\",\"issuingCountry\":\"US\",\"issuingState\":\"CA\",\"issuingCity[PROTECTED],\"issueDate\":null,\"street[PROTECTED],\"street[PROTECTED],\"postalCode\":\"94063\",\"city[PROTECTED],\"state\":\"CA\",\"country\":null}],\"phones\":[{\"phoneNumber\":\"689-165-2363\",\"phoneType\":\"HM\"},{\"phoneNumber\":\"332-621-7769\",\"phoneType\":\"CL\"}]}')
 at [Source: UNKNOWN; byte offset: #UNKNOWN]
    at com.fasterxml.jackson.databind.ObjectMapper._convert(ObjectMapper.java:4394)
    at com.fasterxml.jackson.databind.ObjectMapper.convertValue(ObjectMapper.java:4325)
    at ObjectMapperDemo.ConvertValueFromObject(ObjectMapperDemo.java:19)
    at ObjectMapperDemo.main(ObjectMapperDemo.java:25)
Caused by: com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot construct instance of `java.util.LinkedHashMap` (although at least one Creator exists): no String-argument constructor/factory method to deserialize from String value ('{\"lead_id\":null,\"finder_number\":null,\"applicant_index\":0,\"applicant_id\":100314,\"loan_application_id\":3000312,\"person\":{\"lastName[PROTECTED],\"firstName\":\"Cathy\",\"maternalName[PROTECTED],\"middleName\":\"Kimberly\",\"dateOfBirth[PROTECTED],\"ssn[PROTECTED],\"itin[PROTECTED],\"last4Ssn[PROTECTED],\"last4Itin[PROTECTED],\"oktaId\":null,\"suffix\":\"Sr\",\"title\":null,\"clientId\":null,\"sipClientId\":null,\"customerId\":null,\"inUSSince\":null},\"email\":[{\"home\":\"SwNjh67784@oportun.com\"}],\"address[PROTECTED],\"street[PROTECTED],\"street[PROTECTED],\"city[PROTECTED],\"state\":\"FL\",\"postalCode\":\"33144\"}],\"identification[PROTECTED],\"number[PROTECTED],\"expirationDate\":\"2023-02-02T00:00:00.000Z\",\"dateOfBirth[PROTECTED],\"firstName\":\"Cathy\",\"middleName\":\"Kimberly\",\"lastName[PROTECTED],\"maternalName[PROTECTED],\"suffix\":\"Sr\",\"issuingCountry\":\"US\",\"issuingState\":\"CA\",\"issuingCity[PROTECTED],\"issueDate\":null,\"street[PROTECTED],\"street[PROTECTED],\"postalCode\":\"94063\",\"city[PROTECTED],\"state\":\"CA\",\"country\":null}],\"phones\":[{\"phoneNumber\":\"689-165-2363\",\"phoneType\":\"HM\"},{\"phoneNumber\":\"332-621-7769\",\"phoneType\":\"CL\"}]}')
 at [Source: UNKNOWN; byte offset: #UNKNOWN]
    at com.fasterxml.jackson.databind.exc.MismatchedInputException.from(MismatchedInputException.java:63)
    at com.fasterxml.jackson.databind.DeserializationContext.reportInputMismatch(DeserializationContext.java:1728)
    at com.fasterxml.jackson.databind.DeserializationContext.handleMissingInstantiator(DeserializationContext.java:1353)
    at com.fasterxml.jackson.databind.deser.std.StdDeserializer._deserializeFromString(StdDeserializer.java:311)
    at com.fasterxml.jackson.databind.deser.std.MapDeserializer.deserialize(MapDeserializer.java:444)
    at com.fasterxml.jackson.databind.deser.std.MapDeserializer.deserialize(MapDeserializer.java:32)
    at com.fasterxml.jackson.databind.ObjectMapper._convert(ObjectMapper.java:4389)
    ... 3 more

我什至尝试将字符串作为对象传递

Map<String, Object> testMap = ConvertValueFromObject((Object) applicantJson);

【问题讨论】:

  • 这不是有效的 JSON。为什么引号是双转义的?
  • 只使用单斜杠来转义双引号,例如"{\"lead_id\":null,\"finder_number\":null}"。 json 数据本身也是有效的,例如:"person":{""lastName[PROTECTED],"firstName":"Cathy"。这里键""lastName[PROTECTED]有2个双引号,键lastName[PROTECTED]等没有对应的值
  • 在 json 中我们有双引号,但是当 java 将 json 更改为字符串时,它会为每个引号添加一个反斜杠。
  • 仍然是相同的错误堆栈跟踪。
  • 谢谢@shmosel,JSON 无效,盲目相信通过可靠服务之一发送的数据是有效的,这是我的错误。

标签: java jackson objectmapper jackson-databind


【解决方案1】:

实际上,作为输入提交的 JSON 是无效的(即使删除了 Intellij Idea 在将 Json 复制粘贴到 Java 编辑器时适当转换的双斜杠。同时,来自 Jackson 的错误消息可能有点有意义且误导性较小。

【讨论】:

  • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
猜你喜欢
  • 2014-07-10
  • 1970-01-01
  • 1970-01-01
  • 2019-04-04
  • 2013-02-04
  • 2012-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多