Indagamos en distintos espacios y así tener para ti la solución a tu duda, en caso de alguna pregunta puedes dejarnos la pregunta y te contestamos porque estamos para ayudarte.
Solución:
Este es un ejemplo del uso del enlace de datos Jackson YAML.
Primero, aquí está nuestro documento de muestra:
name: test
parameters:
"VERSION": 0.0.1-SNAPSHOT
things:
- colour: green
priority: 128
- colour: red
priority: 64
Agregue estas dependencias:
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"
)
Aquí está nuestra clase más externa (las condiciones previas son una verificación similar a Guava y genera una excepción si dicho campo no está en el 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
Y aquí está el objeto interior:
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")
Finalmente, aquí está cómo instanciarlo:
val reader = new FileReader("sample.yaml")
val mapper = new ObjectMapper(new YAMLFactory())
val config: Sample = mapper.readValue(reader, classOf[Sample])
SnakeYAML es un analizador/renderizador YAML de alta calidad y mantenido activamente para Java. Por supuesto, puedes usarlo desde Scala.
Si ya está trabajando con circe, es posible que le interese circe-yaml, que usa SnakeYAML para analizar un archivo YAML y luego convierte el resultado en un circe AST.
Me encantaría ver una biblioteca que pudiera analizar JSON o YAML (o lo que sea, conectable) a un AST común y luego construir objetos Scala usando clases de tipos. Varias bibliotecas JSON funcionan así (y, por supuesto, también pueden representar JSON para objetos que usan las mismas clases de tipos), pero no conozco tal instalación para YAML.
PD: También parece haber una serie de contenedores aparentemente abandonados para SnakeYAML, a saber, HelicalYAML y yaml4s.
Un poco tarde para la fiesta, pero creo que este método funciona de la manera más fluida. Este método tiene:
- Conversión automática a tipos de colección Scala
- Clases de casos de uso
- No es necesario un código repetitivo como BeanProperty/JsonProperty
- Utiliza Jackson-YAML y Jackson-scala
Código:
import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory
import com.fasterxml.jackson.module.scala.DefaultScalaModule
case class Prop(url: List[String])
// uses Jackson YAML to parsing, relies on SnakeYAML for low level handling
val mapper: ObjectMapper = new ObjectMapper(new YAMLFactory())
// provides all of the Scala goodiness
mapper.registerModule(DefaultScalaModule)
val prop: Prop = mapper.readValue("url: [abc, def]", classOf[Prop])
// prints List(abc, def)
println(prop.url)
Puedes sostener nuestro estudio dejando un comentario o valorándolo te lo agradecemos.