使用在运行时指定的类将JSON解析为POJO

时间:2014-02-19 18:54:27

标签: java json jackson pojo

鉴于以下结构:

{"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结构,特别是键名不能更改,因此我不能只更改每个“行”键以对应不同的表名。

1 个答案:

答案 0 :(得分:0)

我已使用通用类@JsonTypeInfo上的注释@JsonSubTypesSheet解决了这个问题,如下所示:

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等。

我没有找到直接子类化行的方法,因为我认为子类化适用于包含的值,而不是容器,但这也可以完成工作。