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的对象映射器也应该能够处理多态映射。