簡體   English   中英

使用 Jackson Json 解析格式錯誤的(?) json 文件

[英]Parsing a malformed(?) json file with Jackson Json

我有一個來自MTG JSONJSON 文件,其設置如下:

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM