将超类json反序列化为子类对象
我的软件主要围绕rfid设备。所有这些设备都有(大部分)相同的配置选项,例如天线应发射的功率设置。但是,每个读卡器提供的API在设置天线功率的方式上有所不同。读卡器的配置在中央服务器上完成,并保存为json字符串。我试图找到一种方法,使用一个公共json字符串来配置天线功率(例如),而不必为每个API定制。以下是我想要实现的目标 用于设置天线功率的json字符串如下所示:将超类json反序列化为子类对象,json,jackson,Json,Jackson,我的软件主要围绕rfid设备。所有这些设备都有(大部分)相同的配置选项,例如天线应发射的功率设置。但是,每个读卡器提供的API在设置天线功率的方式上有所不同。读卡器的配置在中央服务器上完成,并保存为json字符串。我试图找到一种方法,使用一个公共json字符串来配置天线功率(例如),而不必为每个API定制。以下是我想要实现的目标 用于设置天线功率的json字符串如下所示: {"power":30} 我的配置电源的超级类: public abstract class SetPower<T&
{"power":30}
我的配置电源的超级类:
public abstract class SetPower<T> {
protected int power;
public SetPower(int power) {
this.power = power;
}
public abstract void configure(T rfidReader);
}
公共抽象类SetPower{
保护内部电源;
公共设置功率(int功率){
这个。力量=力量;
}
公共摘要无效配置(T rfidReader);
}
用于配置CompanyX读卡器电源的子类:
public class CompanyXSetPower extends SetPower<CompanyXReader> {
@JsonCreator
public CompanyXSetPower(@JsonProperty("power") int power) {
super(power);
}
@Override
public void configure(CompanyXReader reader) {
reader.setPower((byte) power);
}
}
public class CompanyYSetPower extends SetPower<CompanyYReader> {
@JsonCreator
public CompanyYSetPower(@JsonProperty("power") int power) {
super(power);
}
@Override
public void configure(CompanyYReader reader) {
reader.setOutputPower(power);
}
}
public class CompanyXSetPower扩展了SetPower{
@JsonCreator
上市公司ySetPower(@JsonProperty(“power”)intpower){
超级(电源);
}
@凌驾
公共无效配置(CompanyReader){
reader.setPower((字节)power);
}
}
用于配置公司读卡器电源的子类:
public class CompanyXSetPower extends SetPower<CompanyXReader> {
@JsonCreator
public CompanyXSetPower(@JsonProperty("power") int power) {
super(power);
}
@Override
public void configure(CompanyXReader reader) {
reader.setPower((byte) power);
}
}
public class CompanyYSetPower extends SetPower<CompanyYReader> {
@JsonCreator
public CompanyYSetPower(@JsonProperty("power") int power) {
super(power);
}
@Override
public void configure(CompanyYReader reader) {
reader.setOutputPower(power);
}
}
公共类公司SetPower扩展SetPower{
@JsonCreator
上市公司yySetPower(@JsonProperty(“power”)int-power){
超级(电源);
}
@凌驾
公共无效配置(CompanyReader reader){
reader.setOutputPower(电源);
}
}
将通用json反序列化为特定子类的“最佳”方法是什么,而不必向json字符串提供特定的类详细信息。我同意将超类细节包含到json字符串中,因为需要某种方法来识别json数据的对象类型。您需要的是将json反序列化为多态类型。 (有关类似问题,请参见示例) 您需要在JSON内容中添加一个额外的类型属性, 例如,
{“type”:“x”,“power”:30}
被反序列化
进入CompanyXSetPower
对象,
和{“type”:“y”,“power”:30}
得到反序列化
进入CompanyYSetPower
对象
为此,您需要使用增强抽象基类SetPower
和注释,以便Jackson
有足够的关于JSON和各种Java类之间映射的信息
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME,
include = JsonTypeInfo.As.PROPERTY, property = "type")
@JsonSubTypes({
@JsonSubTypes.Type(value = CompanyXSetPower.class, name = "x"),
@JsonSubTypes.Type(value = CompanyYSetPower.class, name = "y")
})
public abstract class SetPower<T> {
protected int power;
public SetPower(int power) {
this.power = power;
}
public abstract void configure(T rfidReader);
}
@JsonTypeInfo(use=JsonTypeInfo.Id.NAME,
include=JsonTypeInfo.As.PROPERTY,PROPERTY=“type”)
@JsonSubTypes({
@JsonSubTypes.Type(value=CompanyXSetPower.class,name=“x”),
@JsonSubTypes.Type(value=CompanyYSetPower.class,name=“y”)
})
公共抽象类SetPower{
保护内部电源;
公共设置功率(int功率){
这个。力量=力量;
}
公共摘要无效配置(T rfidReader);
}
然后,反序列化可以简单地通过以下方式完成:
ObjectMapper objectMapper = new ObjectMapper();
SetPower<?> setPower = objectMapper.readValue(url, SetPower.class);
ObjectMapper ObjectMapper=new ObjectMapper();
SetPower SetPower=objectMapper.readValue(url,SetPower.class);
我希望避免json中的特定类型信息。理想情况下,我会有泛型类型信息,比如{“type”:“setPower”,“power”:30}
。然后CompanyX
类将其反序列化为CompanyXSetPower
对象,CompanyY
类将其反序列化为CompanyYSetPower
对象。显然,合同是子类不添加任何新字段,只使用超类的字段。对于这个问题的未来观众来说,我不可能做我希望做的事情。您需要根据这个答案显式地实例化哪个子类。