java – 使用@JsonSubTypes反序列化没有值 – 缺少属性错误
发布时间:2020-12-15 00:52:53 所属栏目:Java 来源:网络整理
导读:我像这样反序列化jsons: { "type":"a","payload" : {...}} 有效负载类型取决于类型.我的课: public class SthT extends Payload { @JsonProperty("type") private String type; @Valid private T payload; @JsonTypeInfo( use = JsonTypeInfo.Id.NAME,incl
我像这样反序列化jsons:
{ "type":"a","payload" : {...} } 有效负载类型取决于类型.我的课: public class Sth<T extends Payload> { @JsonProperty("type") private String type; @Valid private T payload; @JsonTypeInfo( use = JsonTypeInfo.Id.NAME,include = JsonTypeInfo.As.EXTERNAL_PROPERTY,property = "type",visible = true,defaultImpl = NoClass.class) @JsonSubTypes({ @JsonSubTypes.Type(value = APayload.class,name = "a"),@JsonSubTypes.Type(value = BPayload.class,name = "b"),@JsonSubTypes.Type(value = CPayload.class,name = "c")}) public void setPayload(T payload) { this.payload = payload; } public void setType(String type) { this.type = type; } } 我也输入了没有有效载荷的“d”.如果我尝试反序列化: { "type":"d","payload" : null } 它可以工作,但它没有负载有效: { "type":"d",} 如何让它与上一个例子一起工作? 我得到错误的Stacktrace: [error] Caused by: com.fasterxml.jackson.databind.JsonMappingException: Missing property 'payload' for external type id 'type [error] at [Source: N/A; line: -1,column: -1] [error] at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:164) [error] at com.fasterxml.jackson.databind.DeserializationContext.mappingException(DeserializationContext.java:700) [error] at com.fasterxml.jackson.databind.deser.impl.ExternalTypeHandler.complete(ExternalTypeHandler.java:160) [error] at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeWithExternalTypeId(BeanDeserializer.java:690) [error] at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeWithExternalTypeId(BeanDeserializer.java:639) [error] at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:266) [error] at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:124) [error] at com.fasterxml.jackson.databind.ObjectMapper._readValue(ObjectMapper.java:2965) [error] at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:1587) [error] at com.fasterxml.jackson.databind.ObjectMapper.treeToValue(ObjectMapper.java:1931) [error] at play.libs.Json.fromJson(Json.java:47) 解决方法
我也遇到过这个问题,并且使用Jackson提供的机制(自定义BeanDeserializer,BeanDeserializerModifier等)找不到优雅的解决方案.
它看起来像处理外部类型ID的方式中的错误.我解决了以下问题: >将JSON tring反序列化为JsonNode; 我的代码如下所示: public <T> T decode(String json,Class<T> type) throws IOException { JsonNode jsonNode = mapper.readTree(json); if (jsonNode.isObject() && (jsonNode.get("payload") == null || jsonNode.get("payload").size() == 0)) { ObjectNode objectNode = (ObjectNode) jsonNode; objectNode.putNull("payload"); } return mapper.treeToValue(jsonNode,type); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- Java数组的扩容代码示例
- javax.imageio.IIOException:无法从URL获取输入流!
- Glossary of Terms in the JavaTM platform --reference
- JAAS authentication in Tomcat example--reference
- 具有货币符号的Java String.format
- DB2 java存储过程调用返回错误SQLCODE = -440,SQLSTATE = 4
- java – Macbook Air上的JMF视频捕获
- Java生成图形验证码工具类
- 基于两列的Java排序
- java – 尝试通过LDAP启用用户时出现WILL_NOT_PERFORM错误