当前位置: 首页 > 知识库问答 >
问题:

LocalDateTime字段:不匹配的输入异常:无法反序列化START_OBJECT令牌的java.lang.字符串实例

李弘光
2023-03-14

我有一门主课:

@NoArgsConstructor
@AllArgsConstructor
@Data
@Builder
public class ContentModel implements Serializable {
    @JsonProperty("serviceData")
     private ServiceData serviceData;
}

和嵌套类:

 @NoArgsConstructor
 @AllArgsConstructor
 @Data
 @Builder
 public class ServiceData implements Serializable {
    @JsonProperty ("dateTimeMessageSend")
    private LocalDateTime dateTimeMessageSend;
 }

我正在尝试使用自定义反序列化程序反序列化:

public class LocalDateTimeDeserializer extends StdDeserializer<LocalDateTime> {
   private static final long serialVersionUID = 1L;
   protected LocalDateTimeDeserializer() {
        super(LocalDateTime.class);
    }

   @Override
   public LocalDateTime deserialize(final JsonParser jp, final DeserializationContext ctxt)
         throws IOException {
       return LocalDateTime.parse(jp.readValueAs(String.class));
    }
 }

以下是我如何配置objectMapper:

  JavaTimeModule javaTimeModule = new JavaTimeModule();
    javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer());
    this.objectMapper.registerModule(javaTimeModule);
    this.objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
    this.objectMapper.registerModule(new Jdk8Module());
    this.objectMapper.findAndRegisterModules();
 

应用程序在以下json之外接收:

{
 "serviceData": {
    "dateTimeMessageSend": {
       "month": "APRIL",
       "dayOfYear": 109,
       "dayOfWeek": "MONDAY",
       "nano": 183251000,
       "year": 2021,
       "monthValue": 4,
       "dayOfMonth": 19,
       "hour": 14,
       "minute": 52,
       "second": 44,
       "chronology": {
          "calendarType": "iso8601",
          "id": "ISO"
         }
      },
    }
 }

在LocalDateTime反序列化时,我收到异常:

 MismatchedInputException: Cannot deserialize instance of `java.lang.String` out of START_OBJECT token

我想,杰克逊将“dateTimeMessage发送”识别为一个对象,并且无法将其解析为字符串。

解决问题的方法是什么?

  1. 修改源代码json,例如通过将LocalDateFormal更改为String。(什么是不希望的)
  2. 对象映射器或/和LocalDateTimeDeserializer的进一步自定义

共有1个答案

郑卜鹰
2023-03-14

当Jackson调用你的LocalDateTimeSerializer时,你在反序列化方法中实际收到的内容似乎有些误解。

你不会只得到一个长字符串,比如{“month”:“APRIL”,“dayOfYear”:109,…} 。因此,你不能只是简单地打电话

jp.readValueAs(String.class);

这里有一个不匹配的putexpation,因为解析器遇到的是{而不是字符串“something”

实际上,您得到了一个令牌流(从{开始),您应该使用它直到结束}令牌,从中提取相关部分,并从这些部分构建一个LocalDateTime对象。

例如,请参见Baeldung-Getting started with deserialization in Jackson,特别是其中给出的自定义反序列化器示例。遵循此教程,您可以实现如下反序列化方法

@Override
public LocalDateTime deserialize(final JsonParser jp, final DeserializationContext ctxt)
         throws IOException {
    JsonNode node = jp.getCodec().readTree(jp);
    int year = ((NumericNode) node.get("year")).asInt();
    int monthValue = ((NumericNode) node.get("monthValue")).asInt();
    int dayOfMonth = ((NumericNode) node.get("dayOfMonth")).asInt();
    int hour = ((NumericNode) node.get("hour")).asInt();
    int minute = ((NumericNode) node.get("minute")).asInt();
    int second = ((NumericNode) node.get("second")).asInt();
    return LocalDateTime.of(year, monthValue, dayOfMonth, hour, minute, second);
}

请注意,接收到的JSON树中有相当多的冗余,表示LoclDateTime。例如:它包含“月”:“四月”“月值”:4。因此,不需要从树中提取所有值,只需要提取其中的一些值。

 类似资料:
  • 我正在尝试使用将XML反序列化为Java对象,但我遇到了。 XML: 爪哇类: 问题出在< code>id xml标记中,其中提到了< code>type="integer"。如果我删除< code>type="integer",它会工作得非常好。

  • 无法反序列化java实例。lang.String[]值外\u字符串标记[…](通过参考链:[……])。模型用户[“种族”]) 我有一个用户对象的属性。 从这里我可以看出,错误是因为json“type”与属性类型不匹配,但在我的例子中,两者都是字符串数组。 我做错什么了吗? 此外,我无法理解在解析中代表什么。 服务器端正在使用环回,并且ethnicities属性的定义如下: Android客户端使用

  • 我正在尝试反序列化以 XML soap 格式接收的消息。以前这一直在工作,但由于源消息的更改,我现在遇到以下问题 我可以看到这是因为消息中的以下内容.... 我认为问题在于它试图将一个字符串数据类型赋值或“强制转换”到一个空字段上,因此抛出一个错误,指出该字段是一个对象,不能被识别为字符串。 我的问题是如何阻止反序列化程序首先尝试读取这个特定的空字段。这是我在使用Jackson的Java代码中声明

  • 下面是我的JSON响应, 原因:com.fasterxml.jackson.databind.JSONMappingException:无法反序列化[source:java.io.pushbackInputStream@bce1d9;行:1,列:556]处START_OBJECT标记外的java.util.ArrayList实例(通过引用链:com.totalhours[“data”]->com.

  • 我正在尝试发布一个自定义对象的。请求体中的JSON如下所示: 处理请求的服务器端代码: 实体: 但会引发异常:

  • 例外情况: 套接字处理程序 我相信当JSON被解析为WorkstationRequest对象时会出现异常,原因是下面的项。这是套接字处理程序: 我不知道如何开始调试它。堆栈跟踪从未触及我的应用程序。我正在使用部署我的.jar,并使用执行它