2014-02-19 50 views
2

指定的類POJO考慮以下結構:解析JSON使用在運行時

{"sheets" : [ 
    {"sheetName" : "Sheet 1", 
    "rows" : [{"0":"value1", "1":"value2"}, {...}] 
    }, 
    {"sheetName" : "Sheet 2", 
    "rows" : [{"0":"value3", "1":"value4"}, {...}] 
    }, 
    ... 
] 
} 

如何才能使基於屬性SHEETNAME上運行指定的「行」映射類我解析使用傑克遜?例如'Sheet 1'行將映射到類Sheet1 [],'Sheet 2'行將映射到類Sheet2 [],依此類推。 JSON結構,特別是鍵名無法更改,因此我不能只更改每個「行」鍵以對應不同的表名。

+0

如果值相同,難道你不能只映射到一個更通用的'Sheet'類,並且在你獲得java中的結果後,解析它並根據名稱將它設置爲你想要的任何類? –

+0

這些值不會相同,我編輯了這個例子來說明這一點。你可以在映射到一個通用類之後手動進行轉換,但傑克遜的對象映射器也應該能夠處理多態映射。 – geofrey

回答

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 
} 

} 

這種方式,給定的表名稱的所有表將被映射到表的具體子類然後你可以只定義你想要的表子類中,即Sheet1可以Sheet1Rows[]場行的具體子類,等等

我沒有找到一種方法,只需直接繼承行的類型,因爲我覺得繼承適用於t他包含價值觀,而不是容器,但這也完成了工作。