gpt4 book ai didi

java - jackson ,将动态属性值提高一个级别

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:26:24 25 4
gpt4 key购买 nike

我在建模服务器响应时遇到问题,其中一些看起来像这样:

{
"_links":{
"self":{
"href":"http:\/\/example.com"
}
},
"_embedded":{
"category":{
<...data...>
}
}
}

{
"_links":{
"self":{
"href":"http:\/\/example.com"
}
},
"_embedded":{
"episodes":[
<...list_data...>
]
}
}

“_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>> {

}

调用“getEmbedded()”将返回类别列表(或剧集,或任何内容)。

我现在正在使用自定义反序列化,但没有取得太大成功,我希望将代码库保持在最低限度。

最佳答案

解决方案,抽象 POJO 类:

public class EmbeddedResponse<T>  {

@JsonProperty("_embedded")
@JsonDeserialize( using = EmbeddedResponseDeserializer.class )
private T embedded;

public T getEmbedded() {

return embedded;
}
}

用于实际响应的 POJO:

public class CategoriesResponse extends EmbeddedResponse<List<Category>> {

}

有问题的 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;
}

这可能需要更多的时间,但此时此解决方案正在运行

关于java - jackson ,将动态属性值提高一个级别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27566066/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com