杰克逊将动态房产价值提升一级

out*_*ing 9 java jackson

我有建模服务器响应的问题,其中一些看起来像这样:

{
    "_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()'会返回类别列表(或剧集或任何内容).

我现在正在使用自定义反序列化,但没有太大的成功,我想保持代码库最小化.

out*_*ing 0

解决方案,抽象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)

}

可能需要更多周的时间,但目前该解决方案正在发挥作用