Java 使用运行时指定的类将JSON解析为POJO
鉴于以下结构:Java 使用运行时指定的类将JSON解析为POJO,java,json,jackson,pojo,Java,Json,Jackson,Pojo,鉴于以下结构: {"sheets" : [ {"sheetName" : "Sheet 1", "rows" : [{"0":"value1", "1":"value2"}, {...}] }, {"sheetName" : "Sheet 2", "rows" : [{"0":"value3", "1":"value4"}, {...}] }, ... ] } 如何使用jackson进行解析,以便在运行时基于属性sheetNam
{"sheets" : [
{"sheetName" : "Sheet 1",
"rows" : [{"0":"value1", "1":"value2"}, {...}]
},
{"sheetName" : "Sheet 2",
"rows" : [{"0":"value3", "1":"value4"}, {...}]
},
...
]
}
如何使用jackson进行解析,以便在运行时基于属性sheetName指定“rows”映射类?e、 g.“表1”行将映射到类Sheet1[],“表2”行将映射到类Sheet2[],依此类推。JSON结构,特别是键名不能更改,因此我不能只更改每个“行”键以对应不同的工作表名。我使用泛型类
工作表上的注释@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中获得结果后,解析它并根据名称将其设置为您想要的任何类?值将不同,我编辑了示例以澄清这一点。当然,您可以在映射到泛型类之后手动执行转换,但是jackson的对象映射器也应该能够处理多态映射。