繁体   English   中英

使用 Jackson 反序列化 JSON 实体的动态属性

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM