2016-05-29 6 views
1

Ich Parsen diese yaml DateiWie verschachtelte Liste Dump mit SnakeYAML

View: 
    from : 01.01.2007 
    to : 04.01.2007 
    driver : sun.jdbc.odbc.JdbcOdbcDriver 

SnakeYAML in Scala wie folgt aus:

val stream = getClass.getResourceAsStream("/config_view.yml") 
var configMap: Map[String, Any] = new Yaml().load(stream).asInstanceOf[java.util.Map[String, Any]].asScala 
var view = configMap("View").asInstanceOf[java.util.LinkedHashMap[String, String]].asScala 

view = view + ("from" -> "neu") // some test modifying 

und ich Dump es wie folgt aus:

val fileWriter = new FileWriter(System.getProperty("user.home") + "\\Desktop\\test.yml") 
new Yaml().dump(Map[String, Any]("View" -> view.asJava).asJava, fileWriter) 

, die die neue YAML-Datei wie folgt speichert:

View: {driver: sun.jdbc.odbc.JdbcOdbcDriver, from: neu, to: 04.01.2007} 

Aber ich will es es so retten:

View: 
    driver: sun.jdbc.odbc.JdbcOdbcDriver 
    from: neu 
    to: 04.01.2007 

Wie kann ich SnakeYAML sagen, dass es im gewünschten Format siehe oben Sie sparen?

Antwort

1

Wie sei es manuell die Vertiefung und key: value Formatierung Handhabung:

view.map{ case (k,v) => s"\t$k: $v\n" } 

Im Fall von verschachtelten Karten Sie eine Methode wollen die

  • das aktuelle „Niveau“ der Verschachtelung akzeptiert. Platzieren Sie die Registerkarten level vor dem Ausgang, um die richtige Verschachtelung der Ausgänge zu erhalten
  • prüft jeden der Einträge. Wenn es eine andere Sammlung Art wurden dann muss sie sich selbst rekursiv aufrufen - was die inden Ebene
+0

Ja Danke für den Rat. Ich habe eine Funktion geschrieben, wie Sie es gesagt haben, und die Map mit dem Standard-FileWriter abgelegt, anstatt Yaml :: Dump zu verwenden, da diese Funktion Tabs und Zeilenumbrüche nicht ausschließt. – LPrc

4

standardmäßig SnakeYAML verwendet die DumperOptions.FlowStyle.FLOW erhöhen, aber es kann auf die DumperOptions.FlowStyle.BLOCK geändert werden, dass die Daten mit dem gewünschten Format abladen wird.

Ein Beispiel in Kotlin:

val options = DumperOptions() 
options.indent = 2 
options.defaultFlowStyle = DumperOptions.FlowStyle.BLOCK 
Yaml(options).dump(yourObject)