如何使用 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{
}
我收到来自调用 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{
}