我有一门主课:
@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发送”识别为一个对象,并且无法将其解析为字符串。
解决问题的方法是什么?
当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,并使用执行它