[英]Deserialization of dynamic attribute of JSON entity using Jackson
有一个具有value
动态属性的 JSON 实体:
{
"name" : "name1",
"value" : {"different structures: strings, enums, arrays, custom entities"}
}
实体的 Java 表示:
public class Entity {
public String name;
public Object value;
}
在value
中可以传递完全不同的 JSON 结构。 每次value
都应该映射到不同的 POJO。
除了value
属性内容( Map<String, String>
结构)的额外反序列化之外,是否有任何通用方法可以将value
属性反序列化为特定实体?
我已经使用@JsonSubTypes
(序列化为不同类型)或@JsonDeserialize
(自定义序列化)来执行此操作。 您可以在https://www.baeldung.com/jackson-annotations查看一些示例
您可以始终将任何有效的 JSON 文档反序列化到类Map<String, Object>
,而不必进行“额外的”反序列化。 只需更改您的public Object value;
进入public Map<String, Object> value;
它应该工作。
为了知道我应该反序列化value
的确切类型,应该添加新属性valueType
。 此外,应该实现自定义反序列化器来处理所需类型的反序列化。
Entity
类扩展了valueType
和@JsonDeserialize
注解:
public class Entity {
public String name;
@JsonDeserialize(using = EntityValueDeserializer.class)
public Object value;
public Class valueType;
}
JSON 相应更改:
{
"name" : "name1",
"value" : "some string" | 10 | "any custom entity",
"valueType" : "java.lang.String" | "java.lang.Integer" | "any custom type"
}
然后实现自定义反序列化器EntityValueDeserializer
以获取valueType
并将value
反序列化为valueType
:
public class EntityValueDeserializer extends JsonDeserializer<Object>
{
public Object deserialize(JsonParser jp, DeserializationContext ctx) throws IOException
{
ObjectCodec codec = jp.getCodec();
JsonNode node = codec.readTree(jp);
Entity entity = ((Entity) jp.getParsingContext().getCurrentValue());
return codec.treeToValue(node, entity.valueType);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.