使用@JsonSubTypes反序列化无值-缺少属性错误

我像这样反序列化json:

{

"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)

回答:

我也遇到了这个问题,找不到利用杰克逊(定制提供的机制的一流解决方案BeanDeserializerBeanDeserializerModifier等等)。

看起来像是处理外部类型ID的方式中的错误。我通过以下方法解决了这个问题:

  1. 反序列化JSON tring到JsonNode;
  2. null如果不存在所需的属性,则手动插入节点;
  3. 映射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);

}

以上是 使用@JsonSubTypes反序列化无值-缺少属性错误 的全部内容, 来源链接: utcz.com/qa/422142.html

回到顶部