gpt4 book ai didi

java - jackson 反序列化不同对象的类型

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

我有一个返回 boolean 值或单例映射的网络服务结果,例如

boolean 结果:

{
id: 24428,
rated: false
}

map 结果:

{
id: 78,
rated: {
value: 10
}
}

单独我可以很容易地映射这两个,但我该如何做呢?

基本上我想把它映射到一个像这样的类:

public class Rating {
private int id;
private int rated;
...
public void setRated(?) {
// if value == false, set rated = -1;
// else decode "value" as rated
}
}

所有多态示例都使用 @JsonTypeInfo 来根据数据中的属性进行映射,但在这种情况下我没有该选项。


编辑
更新的代码部分:

@JsonProperty("rated")
public void setRating(JsonNode ratedNode) {
JsonNode valueNode = ratedNode.get("value");
// if the node doesn't exist then it's the boolean value
if (valueNode == null) {
// Use a default value
this.rating = -1;
} else {
// Convert the value to an integer
this.rating = valueNode.asInt();
}
}

最佳答案

不不不。您不必编写自定义反序列化程序。首先使用“无类型”映射:

public class Response {
public long id;
public Object rated;
}
// OR
public class Response {
public long id;
public JsonNode rated;
}
Response r = mapper.readValue(source, Response.class);

为“额定”(第一种方法)提供 Booleanjava.util.Map 的值;或第二种情况下的 JsonNode

由此,您可以按原样访问数据,或者更有趣的是,将数据转换为实际值:

if (r.rated instanced Boolean) {
// handle that
} else {
ActualRated actual = mapper.convertValue(r.rated, ActualRated.class);
}
// or, if you used JsonNode, use "mapper.treeToValue(ActualRated.class)

还有其他类型的方法——使用创建者“ActualRated(boolean)”,让实例从 POJO、从标量构造。但我认为以上应该可行。

关于java - jackson 反序列化不同对象的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20143114/

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