鉴于以下结构:
{"sheets" : [
{"sheetName" : "Sheet 1",
"rows" : [{"0":"value1", "1":"value2"}, {...}]
},
{"sheetName" : "Sheet 2",
"rows" : [{"0":"value3", "1":"value4"}, {...}]
},
...
]
}
如何使用jackson解析,以便在运行时根据属性sheetName指定'rows'映射类?例如'Sheet 1'行将映射到Sheet1 []类,'Sheet 2'行将映射到类Sheet2 [],依此类推。 JSON结构,特别是键名不能更改,因此我不能只更改每个“行”键以对应不同的表名。
答案 0 :(得分:0)
我已使用通用类@JsonTypeInfo
上的注释@JsonSubTypes
和Sheet
解决了这个问题,如下所示:
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
}
}
这样,具有给定工作表名称的所有工作表都将映射到工作表的特定子类,然后您可以在Sheet子类中定义所需的特定子类,即Sheet1
可以{{1 }} field等。
我没有找到直接子类化行的方法,因为我认为子类化适用于包含的值,而不是容器,但这也可以完成工作。