Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将超类json反序列化为子类对象_Json_Jackson - Fatal编程技术网

将超类json反序列化为子类对象

将超类json反序列化为子类对象,json,jackson,Json,Jackson,我的软件主要围绕rfid设备。所有这些设备都有(大部分)相同的配置选项,例如天线应发射的功率设置。但是,每个读卡器提供的API在设置天线功率的方式上有所不同。读卡器的配置在中央服务器上完成,并保存为json字符串。我试图找到一种方法,使用一个公共json字符串来配置天线功率(例如),而不必为每个API定制。以下是我想要实现的目标 用于设置天线功率的json字符串如下所示: {"power":30} 我的配置电源的超级类: public abstract class SetPower<T&

我的软件主要围绕rfid设备。所有这些设备都有(大部分)相同的配置选项,例如天线应发射的功率设置。但是,每个读卡器提供的API在设置天线功率的方式上有所不同。读卡器的配置在中央服务器上完成,并保存为json字符串。我试图找到一种方法,使用一个公共json字符串来配置天线功率(例如),而不必为每个API定制。以下是我想要实现的目标

用于设置天线功率的json字符串如下所示:

{"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
对象。显然,合同是子类不添加任何新字段,只使用超类的字段。对于这个问题的未来观众来说,我不可能做我希望做的事情。您需要根据这个答案显式地实例化哪个子类。