首頁  >  文章  >  有沒有辦法將 Java 枚舉與 YAML 進行(反)序列化?

有沒有辦法將 Java 枚舉與 YAML 進行(反)序列化?

WBOY
WBOY轉載
2024-02-08 22:15:18938瀏覽

php小編草莓回答:是的,有辦法將 Java 枚舉與 YAML 進行序列化與反序列化。 Java 枚舉可以透過使用 Jackson、Gson 或其他 JSON 函式庫來實現序列化和反序列化。 YAML 是一種人類友善的資料格式,也可以透過 Jackson、SnakeYAML 或其他 YAML 函式庫來實現與 Java 枚舉的序列化和反序列化。使用這些函式庫,可以輕鬆地將 Java 枚舉與 YAML 進行轉換,實現資料的傳輸和儲存。

問題內容

我正在嘗試序列化和反序列化一個包含枚舉到/來自 YAML 表示的 Java 物件。我正在嘗試使用 Jackson (com.fasterxml.jackson) 套件來執行此操作。

我不斷收到此異常:

Caused by: com.fasterxml.jackson.databind.exc.InvalidFormatException: Cannot deserialize value of type `com.beastcode.devops.prometheusbroker.domain.Metric$Type` from String "counter": not one of the values accepted for Enum class: [GAUGE, COUNTER]

我假設我需要某種適配器或轉換器,但不知道 YAML 有什麼可用(如果有的話)。

供參考:

Metric.java:

public class Metric {

  public enum Type {
    COUNTER, GAUGE
  }

  private String           name;
  private String           description;
  private Type             type;
  private List<String>     labels;
  private List<MetricData> data;

  // getters/setters removed
}

數據.yaml:

---
name: gitlab_pipeline_success_total
description: "blah blah blah"
type: counter
labels:
  - project
  - somethingElse
data:

解析器.java:

public class Parser {

  private ObjectMapper mapper = new ObjectMapper(new YAMLFactory());

  public void parse() throws StreamReadException, DatabindException, IOException {
    Metric m = mapper.readValue(new File("data.yaml"), Metric.class);
  }

}

解決方法

預設情況下,Jackson 使用枚舉的 valueOf 方法。區分大小寫。

您可以透過新增以 @JsonCreator 註解的靜態方法來輕鬆變更此設定:

public class Metric {

    public enum Type {
        COUNTER, GAUGE;

        @JsonCreator
        public static Type getType(String value) {
            return valueOf(value.toUpperCase());
        }

        // optional, for serialization
        @JsonValue
        public String value() {
            return name().toLowerCase();
        }
    }

    // rest omitted
}

以上是有沒有辦法將 Java 枚舉與 YAML 進行(反)序列化?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除