java - 杰克逊在反序列化时忽略子类型属性
问题描述
我在 Jackson 中使用了一个 subType 属性,我想在反序列化 json 时使用这个属性。
package com.gaosoft.ai.kg.commons.sphinx.strategy;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.sankuai.ai.kg.commons.sphinx.model.FAQRecord;
import com.sankuai.ai.kg.commons.sphinx.model.FAQRequest;
import org.springframework.beans.factory.BeanFactory;
import java.io.Serializable;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME,
property = "strategyType"
)
@JsonSubTypes({
@JsonSubTypes.Type(value = StrategyEmpty.class, name = "empty"),
@JsonSubTypes.Type(value = StrategyNormal.class, name = "normal"),
@JsonSubTypes.Type(value = StrategyDummy.class, name = "dummy")
}
)
public abstract class Strategy implements Serializable {
private String strategyName;
private String strategyType;
private Map<String, Object> args = new HashMap<>();
public String getStrategyType() {
return strategyType;
}
public void setStrategyType(String strategyType) {
this.strategyType = strategyType;
}
public Map<String, Object> getArgs() {
return args;
}
public void setArgs(Map<String, Object> args) {
this.args = args;
}
public String getStrategyName() {
return strategyName;
}
public void setStrategyName(String strategyName) {
this.strategyName = strategyName;
}
public abstract void init(BeanFactory beanFactory);
public abstract List<FAQRecord> fetchFAQ(FAQRequest request);
}
就像我的代码说的那样,抽象类 Strategy 有 3 个子类型,我想在 strategyType 属性中保留子类类型名称。以这种方式使用jackson时有没有办法填充strategyType?
(对不起我的英语不好)
解决方案
我认为您要的是@JsonTypeInfo#visible
财产:
关于类型标识符可见性的注意事项:默认情况下,类型标识符的反序列化(在读取 JSON 期间使用)完全由 Jackson 处理,并且不会传递给反序列化程序。但是,如果需要,可以定义属性 visible = true 在这种情况下,属性将在反序列化时按原样传递给反序列化器(并通过 setter 或字段设置)。
所以在你的例子中,
@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME,
property = "strategyType",
visible = true
)
也就是说,这似乎是一种设计气味。您可以将 a 设置为真的有效StrategyEmpty
吗?如果不是,并且应该总是有一个of ,那么为什么不只是有一个每个子类使用硬编码值实现的抽象呢?strategyType
dummy
StrategyEmpty
strategyType
empty
getStrategyType()
推荐阅读
- python - 如何根据索引将列表的值替换为另一个列表的值
- sql - 相同的查询,不同的结果;子查询问题
- android - 如何在 iOS 设备上设置仅查看的边距?
- javascript - 如何使用数组对象内的数组进行过滤
- xamarin.forms - 是否可以从模式中导航回来,然后在同一个导航操作中进一步返回?
- javascript - 如何将 JS 模块 (.mjs) 导入 QML
- llvm - 如何检查两个 GEP 指令在语义上是否相等?
- ignite - ignite 从 2.7 升级到 2.11 ,启动时出错
- javascript - 在浏览器上运行 JavaScript,并使用 R 和 Shiny 在服务器上处理结果
- c# - 在另一个启动 WPF 之前等待一个动画结束