我有建模服务器响应的问题,其中一些看起来像这样:
{
"_links":{
"self":{
"href":"http:\/\/example.com"
}
},
"_embedded":{
"category":{
<...data...>
}
}
}
Run Code Online (Sandbox Code Playgroud)
要么
{
"_links":{
"self":{
"href":"http:\/\/example.com"
}
},
"_embedded":{
"episodes":[
<...list_data...>
]
}
}
Run Code Online (Sandbox Code Playgroud)
似乎"_embedded"属性只有一个JSON对象,并且该对象只有一个属性(命名方式不同)和实际数据.
我想创建一些通用的POJO类来支持这种响应,例如:
public abstract class EmbeddedResponse<T> {
@JsonProperty("_embedded")
private T embedded;
public T getEmbedded() {
return embedded;
}
... <other_members> ...
}
public class CategoriesResponse extends EmbeddedResponse<List<Category>> {
}
Run Code Online (Sandbox Code Playgroud)
调用'getEmbedded()'会返回类别列表(或剧集或任何内容).
我现在正在使用自定义反序列化,但没有太大的成功,我想保持代码库最小化.
解决方案,抽象POJO类:
public class EmbeddedResponse<T> {
@JsonProperty("_embedded")
@JsonDeserialize( using = EmbeddedResponseDeserializer.class )
private T embedded;
public T getEmbedded() {
return embedded;
}
}
Run Code Online (Sandbox Code Playgroud)
POJO 实际响应:
public class CategoriesResponse extends EmbeddedResponse<List<Category>> {
}
Run Code Online (Sandbox Code Playgroud)
有关 JSON 的反序列化器:
public class EmbeddedResponseDeserializer extends JsonDeserializer<Object> implements ContextualDeserializer {
private JavaType javaType;
@Override
public Object deserialize( JsonParser jsonParser, DeserializationContext ctxt ) throws IOException {
ObjectCodec objectCodec = jsonParser.getCodec();
JsonNode node = objectCodec.readTree(jsonParser);
// Get first it might require correction
String fieldName = node.fieldNames().next();
JsonNode skippedNode = node.get( fieldName );
return objectCodec.readValue( skippedNode.traverse(), javaType );
}
@Override
public JsonDeserializer<?> createContextual( DeserializationContext ctxt, BeanProperty property ) throws JsonMappingException {
javaType = property.getType();
return this;
}
Run Code Online (Sandbox Code Playgroud)
}
可能需要更多周的时间,但目前该解决方案正在发挥作用
| 归档时间: |
|
| 查看次数: |
1000 次 |
| 最近记录: |