Hier ist ein Beispiel für die Verwendung der Jackson YAML Datenbindung.
Zuerst, hier ist unser Beispieldokument:
name: test
parameters:
"VERSION": 0.0.1-SNAPSHOT
things:
- colour: green
priority: 128
- colour: red
priority: 64
diese Abhängigkeiten hinzufügen:
libraryDependencies ++= Seq(
"com.fasterxml.jackson.core" % "jackson-core" % "2.1.1",
"com.fasterxml.jackson.core" % "jackson-annotations" % "2.1.1",
"com.fasterxml.jackson.core" % "jackson-databind" % "2.1.1",
"com.fasterxml.jackson.dataformat" % "jackson-dataformat-yaml" % "2.1.1"
)
Hier ist unsere äußerste Klasse (Voraussetzung ist ein Guava artige Überprüfung und löst eine Ausnahme aus, wenn das Feld nicht ist in der YAML):
import java.util.{List => JList, Map => JMap}
import collection.JavaConversions._
import com.fasterxml.jackson.annotation.JsonProperty
class Sample(@JsonProperty("name") _name: String,
@JsonProperty("parameters") _parameters: JMap[String, String],
@JsonProperty("things") _things: JList[Thing]) {
val name = Preconditions.checkNotNull(_name, "name cannot be null")
val parameters: Map[String, String] = Preconditions.checkNotNull(_parameters, "parameters cannot be null").toMap
val things: List[Thing] = Preconditions.checkNotNull(_things, "things cannot be null").toList
}
Und hier ist das innere Objekt:
import com.fasterxml.jackson.annotation.JsonProperty
class Thing(@JsonProperty("colour") _colour: String,
@JsonProperty("priority") _priority: Int {
val colour = Preconditions.checkNotNull(_colour, "colour cannot be null")
val priority = Preconditions.checkNotNull(_priority, "priority cannot be null")
}
Schließlich ist hier, wie es instanziiert:
val reader = new FileReader("sample.yaml")
val mapper = new ObjectMapper(new YAMLFactory())
val config: Sample = mapper.readValue(reader, classOf[Sample])
Das HelicalYAML wird im Moment nicht gepflegt (lt. Projektwebsite; letztes Commit war 2010) – fikovnik
Für mich ist der Hauptnachteil der Verwendung von SnakeYAML, dass man nur veränderbare Klassen mit Java-Sammlung serialisieren kann, wenn man automatisch parsen möchte mit Reflexion. Das bringt mich dazu, 2 Klassen zu schreiben. Unveränderliche, die in Code und Beany-One verwendet wird, die @BeanProperties enthält und Java-Auflistungen mit einer Build-Methode verwendet, um einen unveränderlichen Companion zu erstellen. Habe ich etwas verpasst? Vielleicht gibt es einige Makro-basierte Metaprogrammierungslösungen, um mich von der Doppelcodierung zu befreien? –