如何使用 Spring RestTemplate 和 Jackson 从 JSON 解组动态类型

How do I unmarshal a dynamic type from JSON with Spring RestTemplate and Jackson

我收到来自调用 Elastic Search 的 API 的 JSON 响应。以下是示例片段。

{
  "fielda" : "something",
  "hits" : {
    "total" : "100",
    "type" : "/some/type"
    "dynamicAttributes":{
       "somevalue1" : "somevalue",
       "somevalue2" : "somevalue2"
    }
  }
}

dynamicAttributes 下的 JSON 子树可能因每个结果而异。我正在尝试根据传入的 type 字段将其编组到一个对象中。该值与地图中某处的 class 之间将建立映射。如果类型未解析,看起来 Jackson 将结果映射到 LinkedHashMap。我正在寻找使用自定义反序列化器。这是最好的策略吗?还是我遗漏了一些更简单的东西。

您可以使用 @JsonTypeInfo@JsonSubType 注释来编组给定的输入。

在您的 dynamicAttributes 字段上,您可以添加 JsonTypeInfo 注释来指定如何创建 dynamicAttribute 的对象。 EXTERNAL_PROPERTY 类型表示 type 字段出现在 dynamicAttributes.

级别
  @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property ="type", include = JsonTypeInfo.As.EXTERNAL_PROPERTY,
      visible = true)
  DynamicAttributes dynamicAttributes;

要指定可能的子类型,请使用 JsonSubTypes 注释,如下所示

@JsonSubTypes({
  @JsonSubTypes.Type(value = DynamicAttributesType1.class, name = "type1")
  , @JsonSubTypes.Type(value = DynamicAttributesType2.class, name = "type2")
})
public abstract class DynamicAttributes{
}