给定以下结构:
{"sheets" : [
{"sheetName" : "Sheet 1",
"rows" : [{"0":"value1", "1":"value2"}, {...}]
},
{"sheetName" : "Sheet 2",
"rows" : [{"0":"value3", "1":"value4"}, {...}]
},
...
]
}
我如何使用 jackson 进行解析,以便在运行时根据属性 sheetName 指定“行”映射类?例如“Sheet 1”行将映射到 Sheet1[] 类,“Sheet 2”行将映射到 Sheet2[] 类,依此类推。 JSON 结构,特别是键名称无法更改,所以我不能只更改每个“行”键以对应于不同的工作表名称。
最佳答案
我已经使用通用类 Sheet
上的注释 @JsonTypeInfo
和 @JsonSubTypes
解决了这个问题,如下所示:
public class Json {
public Sheet[] sheets = {};
@JsonTypeInfo(use=Id.NAME, include=As.PROPERTY, property="sheetName")
@JsonSubTypes({
// list all sheet name : class mapping here
@Type(name=MetadataSheet.sheetName, value=MetadataSheet.class)
})
static class Sheet {}
static class Sheet1 extends Sheet {
public static final String sheetName = "Sheet 1";
public Sheet1Rows[] rows; // subclasses a generic class Row
}
}
这样,所有具有给定工作表名称的工作表都将映射到工作表的特定子类,然后您可以在工作表子类中定义您想要的特定行子类,即 Sheet1
可以有Sheet1Rows[]
字段等
我没有找到直接子类化行类型的方法,因为我认为子类化适用于包含的值,而不是容器,但这也能完成工作。
关于java - 使用运行时指定的类将 JSON 解析为 POJO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21889708/