2017-02-22 4 views
0

Ich versuche YAML Datei von Scala zu lesen, und ich kann die Datei mit dem unten angegebenen Code lesen. Einer der Nachteile, die ich hier sehe, ist die Notwendigkeit für mich, case class zu erstellen, um eine Zuordnung mit der YAML Datei zu haben, die ich verwende. Jedes Mal, wenn ich den Inhalt von YAML ändere, wird es notwendig für mich, die case class zu ändern. Gibt es eine Möglichkeit in Scala zu lesen YAMLohne die Notwendigkeit für mich, die case class zu erstellen. (Ich habe auch verwendet, PythonYAML zu lesen, wo wir haben nicht die Einschränkung der Zuordnung eines Class mit der YAML Struktur ... und möchte in Scala ähnlich, was zu tun)Lesen von YAML in Scala ohne "Fallklasse"

Hinweis: Als ich ein hinzufügen neue Eigenschaft in YAML und wenn mein case class ich UnrecognizedPropertyException

package yamlexamples 

import com.fasterxml.jackson.dataformat.yaml.YAMLFactory 
import com.fasterxml.jackson.databind.ObjectMapper 
import com.fasterxml.jackson.module.scala.DefaultScalaModule 

object YamlTest extends App{ 


    case class Prop(country: String, state: List[String]) 

    val mapper: ObjectMapper = new ObjectMapper(new YAMLFactory()) 

    mapper.registerModule(DefaultScalaModule) 
    val fileStream = getClass.getResourceAsStream("/sample.yaml") 
    val prop:Prop = mapper.readValue(fileStream, classOf[Prop]) 

    println(prop.country + ", " + prop.state) 

} 

sample.yaml keine passende Eigenschaft haben (Dies funktioniert mit Code)

country: US 
state: 
    - TX 
    - VA 

sample.yaml (Diese throws Exception)

country: US 
state: 
    - TX 
    - VA 
continent: North America 

Antwort

2

Sie konnten die YAML-Datei analysieren und laden als eine Sammlung statt Falfall widersprechen. Dies geht jedoch auf Kosten der Verlust der Typsicherheit in Ihrem Code. Der Below-Code verwendet die load-Funktion, die von unterstützt wird. Beachten Sie, dass die loadoverloaded methods von einem Inputstream/Leser als auch ..

import scala.collection.JavaConverters._ 
val yaml = new Yaml() 
val data = yaml.load(
     """ 
     |country: US 
     |state: 
     | - TX 
     | - VA 
     |continent: North America 
     """.stripMargin).asInstanceOf[java.util.Map[String, Any]].asScala 

Jetzt Daten ein scala wandelbar Sammlung ist anstelle einer Fallklasse zu lesen hat

data: scala.collection.mutable.Map[String,Any] = Map(country -> US, state -> [TX, VA], continent -> North America)