如何使用@JsonTypeInfo和@JsonSubTypes来实例化具有不同配置的类?

时间:2018-02-22 15:47:46

标签: java json jackson

我想创建一个配置文件,允许我定义不同的数据生成器,每个数据生成器都需要不同的配置。但是,它们都共享相同的方法generateRow,因此这些类都可以实现接口。我使用Jackson版本2.9.4。

为了说明,这里有两个示例配置文件:

{
    "data": {
        "type": "standard",
        "config": {
            "rows": 1000,
            "columns": 10
        }
    }
}

{
    "data": {
        "type": "totalSize",
        "config": {
            "sizeInBytes": 1073741824,
            "cellDensityInBytes": 12,
            "columns": 5
        }
    }
}

第一个数据生成器只是创建一个具有给定行数和列数的文件,第二个生成器创建一个预定义大小的文件,确定满足配置变量所需的行数(即列数)和细胞密度)。

所以,我创建了一个界面:

import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonSubTypes.Type;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.annotation.JsonTypeInfo.As;
import com.fasterxml.jackson.annotation.JsonTypeInfo.Id;

@JsonTypeInfo(use = Id.NAME, include = As.PROPERTY, property = IGenerateRows.PROPERTY, defaultImpl = StandardRowGenerator.class)
@JsonSubTypes(value = { @Type(StandardRowGenerator.class) })
public interface IGenerateRows {

    public static final String PROPERTY = "type";

    public String[] generateRow();
}

我至少有一个具体的实现:

import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonTypeName;

@JsonTypeName(value = StandardRowGenerator.TYPE)
public class StandardRowGenerator {

    public static final String TYPE = "standard";

    private static final String ROWS = "rows";
    private static final String COLUMNS = "columns";

    @JsonProperty(value = ROWS, required = true)
    private int rows;

    @JsonProperty(value = COLUMNS, required = true)
    private int columns;
}

我无法弄清楚的是,如何处理配置文件中数据生成器节点的config节点。我如何正确设置我的具体类来定义生成数据所需的属性?

在我的引导代码中,我按如下方式实例化整个配置对象:

new ObjectMapper().readValue(inputStream, DataGeneratorConfig.class);

为简洁起见,我省略了getter和setter,以及配置文件的其余部分与现有问题无关。如果我可以提供任何其他详细信息或代码,请告诉我。

0 个答案:

没有答案