Leggere e scrivere file YAML in Scala con circe

Mattepuffo's logo
Leggere e scrivere file YAML in Scala con circe

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!


Condividi

Commentami!