[英]Parsing a malformed(?) json file with Jackson Json
{
"data": {
"10E": {
...
}
"2ED": {
...
}
"3ED": {
...
}
...
}
}
data
下的每個對象都是Set
類型,但它們沒有標記為Set
,而是像您在上面看到的那樣標記 - 帶有三個字母的 set-code。
我知道我可以做這樣的事情:
public class Data {
@JsonProperty("10E")
Set x10E;
@JsonProperty("2ED")
Set x2ED;
}
但我不想按名稱對每個集合進行硬編碼。 相反,我想要一個數組或集合列表。 像這樣的東西,其中 Jackson 忽略 label 並將其視為設置對象的數組(或任何其他列表)。
public class Data {
Set[] sets;
}
有沒有辦法讓 Jackson JSON 進行轉換? 我當前的主要方法如下所示:
public class AllPrintings {
Data data;
public static void main(String[] args) throws Exception {
byte[] jsonData = Files.readAllBytes(Paths.get("stage/AllPrintings.json"));
JsonParser parser = new ObjectMapper().readTree(jsonData).traverse();
ObjectMapper om = new ObjectMapper();
parser.nextToken();
om.setVisibility(VisibilityChecker.Std.defaultInstance().withFieldVisibility(Visibility.ANY));
AllPrintings allPrintings = om.readValue(parser, AllPrintings.class);
}
}
正如@Tom 在評論中推薦的那樣,我可以使用注釋@JsonAnySetter
將任何未定義的字段轉儲到 Map 中:
public class Data {
Map<String, Set> sets = new HashMap<>();
@JsonAnySetter
public void setOtherField(String name, Set value) {
sets.put(name, value);
}
}
首先, Set
是標准內置 Java 類型的名稱,因此我將使用MtgSet
以避免使用現有名稱造成混淆。
看起來您可能正在解析JSON:API ,在這種情況下,專門處理其結構的庫可能會有所幫助。 但是,我將在簡單的 Jackson 中展示如何做到這一點。
首先,我們將定義一個包裝器 class 以匹配您的根 JSON:
class AllPrintings {
Map<String, MtgSet> data;
}
您的 Jackson 調用有點過於復雜,我們可以簡化。
var is = new FileInputStream("stage/AllPrintings.json"); // just open it directly
Map<String, MtgSet> sets = new ObjectMapper()
.readValue(is, AllPrintings.class) // no need to explicitly mess with parser instances
.data; // pull the wrapped value out of the wrapper class
is.close();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.