json - Jackson Mixin 反序列化不允许空值
问题描述
我正在尝试使用看起来像这样的 mixin 反序列化一个我无法修改的简单 Java 类
public abstract class CallLegStateChangedEventMixIn {
@JsonCreator
public CallLegStateChangedEventMixIn(
@JsonProperty String conversationId,
@JsonProperty String callLegId,
@JsonProperty CallState callState) {
}
}
然后像这样反序列化代码
ObjectMapper mapper = new ObjectMapper();
mapper.addMixIn(CallLegStateChangedEvent.class, CallLegStateChangedEventMixIn.class);
CallLegStateChangedEvent callLegStateChangedEvent = mapper.readValue(eventDataJsonString, CallLegStateChangedEvent.class);
当我有一个包含所有值的 JSON 时,此代码可以正常工作。但是当 JSON 中有一个字段为 null 时,反序列化会失败并出现此错误,
com.fasterxml.jackson.databind.exc.ValueInstantiationException:无法构造实例com.azure.communication.callingserver.models.events.CallLegStateChangedEvent
,问题:在 [Source: (String)"{"callLegId":"03000480-ca4d-494d-920e-f836b6a0db0d" ,"callState":"正在建立"}"; line: 1, column: 79] at com.fasterxml.jackson.databind.exc.ValueInstantiationException.from(ValueInstantiationException.java:47) at com.fasterxml.jackson.databind.DeserializationContext.instantiationException(DeserializationContext.java:1907) at com .fasterxml.jackson.databind.deser.std.StdValueInstantiator.wrapAsJsonMappingException(StdValueInstantiator.java:587)
在 com.fasterxml.jackson.databind.deser.std.StdValueInstantiator.rewrapCtorProblem(StdValueInstantiator.java:610) 在 com.fasterxml.jackson.databind.deser.std.StdValueInstantiator.createFromObjectWith(StdValueInstantiator.java:293) 在 com.fasterxml .jackson.databind.deser.ValueInstantiator.createFromObjectWith(ValueInstantiator.java:288) 在 com.fasterxml.jackson.databind.deser.impl.PropertyBasedCreator.build(PropertyBasedCreator.java:202) 在 com.fasterxml.jackson.databind.deser .BeanDeserializer._deserializeUsingPropertyBased(BeanDeserializer.java:520) at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromObjectUsingNonDefault(BeanDeserializerBase.java:1405) at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java :362) 在 com.fasterxml.jackson.databind.deser.BeanDeserializer。com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.readRootValue(DefaultDeserializationContext.java:322) 的反序列化(BeanDeserializer.java:195)
在 com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4593) 在 com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3548) 在 com.fasterxml.jackson.databind.ObjectMapper.readValue (ObjectMapper.java:3516) at com.azure.communication.callingserver.models.events.CallLegStateChangedEvent.deserialize(CallLegStateChangedEvent.java:143)
at com.calling.App.main(App.java:20) 原因:java。 lang.IllegalArgumentException:com.azure.communication.callingserver.models.events.CallLegStateChangedEvent.(CallLegStateChangedEvent.java:112) 中的对象 conversationId 不能为空或为空
在 java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 在 java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:78) 在 java.base/jdk.internal.reflect。 DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
在 java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499) 在 java.base/java.lang.reflect.Constructor.newInstance(Constructor.java: 480)在com.fasterxml.jackson.databind.introspect.AnnotatedConstructor.call(AnnotatedConstructor.java:124)在com.fasterxml.jackson.databind.deser.std.StdValueInstantiator.createFromObjectWith(StdValueInstantiator.java:291)... 12更多的
问题是,在使用 Jackson MixIns 时,如何允许对空值或空值进行反序列化?
解决方案
推荐阅读
- sql - 从搜索特定模式的 <> 标记中提取文本
- powershell - Active Directory Powershell 到固定宽度的 txt 文件
- sml - SML映射过滤器?
- r - showtext/sysfont 包中的 font_add_google 函数不起作用
- python - 从 .txt 文件中检索输入
- html - 考虑引导列的背景左侧和其他背景右侧
- amazon-sns - 如何使用 AWS SNS 向电子邮件组发送电子邮件通知?
- r - R如何从输出中仅获取行号?
- domain-driven-design - CQRS 命令用于处理而不是用于更新聚合
- css - 使用 css 放大动画效果无法正常工作