Leggere e scrivere file YAML in Scala con circe
In Scala abbiamo la libreria circe che fa ci consente di fare il parsing di vari formati.
In questo articolo vediamo come usarla per creare e leggere il formato YAML.
Aggiungiamo un pò di dipendenza; se usate sbt:
libraryDependencies ++= Seq(
"io.circe" %% "circe-core" % "0.14.10",
"io.circe" %% "circe-yaml" % "1.15.0",
"io.circe" %% "circe-generic" % "0.14.10",
"io.circe" %% "circe-parser" % "0.14.10"
)
Qui un esempio completo:
import io.circe.generic.auto._
import io.circe.syntax._
import io.circe.yaml.{parser, Printer}
import java.io.{File, PrintWriter}
import scala.io.Source
case class Indirizzo(via: String, citta: String)
case class Persona(nome: String, eta: Int, indirizzo: Indirizzo, hobby: List[String])
@main
def main(): Unit = {
val fileYaml = "test.yaml"
val persona = Persona(
nome = "Mario Rossi",
eta = 30,
indirizzo = Indirizzo("Via Roma", "Milano"),
hobby = List("calcio", "lettura", "viaggi")
)
// Scrittura
val yamlString = Printer(dropNullKeys = true, preserveOrder = true).pretty(persona.asJson)
val writer = new PrintWriter(new File(fileYaml))
writer.write(yamlString)
writer.close()
println(s"File YAML '$fileYaml' creato con successo!")
// Lettura
val source = Source.fromFile(fileYaml)
val yamlContent = source.getLines().mkString("n")
source.close()
val parsedJson = parser.parse(yamlContent)
parsedJson match {
case Right(json) =>
json.as[Persona] match {
case Right(parsedPersona) =>
println("Dati letti dal file YAML:")
println(parsedPersona)
case Left(error) =>
println(s"Errore nel parsing dei dati: $error")
}
case Left(error) =>
println(s"Errore nel parsing del YAML: $error")
}
}
Le due case class rappresentano la nostra struttura dati; io ho messo tutto insieme per comodià.
Enjoy!
scala sbt yaml circe
Commentami!