Heim  >  Artikel  >  Gibt es eine Möglichkeit, Java-Enums mit YAML (de)serialisieren?

Gibt es eine Möglichkeit, Java-Enums mit YAML (de)serialisieren?

WBOY
WBOYnach vorne
2024-02-08 22:15:18951Durchsuche

php-Editor-Erdbeer-Antworten: Ja, es gibt eine Möglichkeit, Java-Enumerationen und YAML zu serialisieren und zu deserialisieren. Java-Aufzählungen können mithilfe von Jackson-, Gson- oder anderen JSON-Bibliotheken serialisiert und deserialisiert werden. YAML ist ein benutzerfreundliches Datenformat, das auch zum Serialisieren und Deserialisieren von Java-Enums über Jackson, SnakeYAML oder andere YAML-Bibliotheken verwendet werden kann. Mithilfe dieser Bibliotheken können Sie Java-Aufzählungen zur Datenübertragung und -speicherung problemlos in YAML konvertieren.

Frageninhalt

Ich versuche, ein Java-Objekt, das eine Aufzählung enthält, in/von einer YAML-Darstellung zu serialisieren und zu deserialisieren. Ich versuche, dazu das Jackson-Paket (com.fasterxml.jackson) zu verwenden.

Ich bekomme immer wieder diese Ausnahme:

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]

Ich gehe davon aus, dass ich einen Adapter oder Konverter benötige, weiß aber nicht, was für YAML verfügbar ist (falls vorhanden).

Zur Referenz:

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
}

data.yaml:

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

parser.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);
  }

}

Workaround

Standardmäßig verwendet Jackson die valueOf-Methode der Aufzählung. Groß- und Kleinschreibung beachten.

Sie können dies leicht ändern, indem Sie eine statische Methode hinzufügen, die mit @JsonCreator:

versehen ist
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
}

Das obige ist der detaillierte Inhalt vonGibt es eine Möglichkeit, Java-Enums mit YAML (de)serialisieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen