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

标签 java json jackson pojo

给定以下结构:

{"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/

相关文章:

java - 如何在同一个类下设计多个对象,如 JSON 映射所示?

ios - NSJSONSerialization - 无法将数据转换为字符串

java - 在 Java 字符串中高效

java - 获取SerializationService,通过序列化进行克隆

java - Swing 上自定义组件的问题

php - 将 json 数据转换为 HTML 表格

javascript - 使用javascript解析JSON并获取数组中的特定值

java - 可以将 Jackson 配置为从所有字符串属性中修剪前导/尾随空格吗?

java - Jackson:如何获取完整的 JSON 字符串,该字符串在序列化或反序列化过程中进行解析

java - 如何获取0-1背包中选中的元素列表?