如何使用SnakeYAML转储嵌套列表

时间:2016-05-29 19:58:43

标签: scala yaml

我正在解析这个yaml文件

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

在Scala中使用SnakeYAML,如下所示:

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

我把它丢弃了:

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

保存新的yaml文件,如下所示:

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

但是我希望它能像这样保存它:

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

如何告诉SnakeYAML将其保存为您在上面看到的所需格式?

2 个答案:

答案 0 :(得分:5)

默认情况下,SnakeYAML使用DumperOptions.FlowStyle.FLOW,但可以将其更改为DumperOptions.FlowStyle.BLOCK,它将以所需格式转储数据。

Kotlin的一个例子:

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

答案 1 :(得分:1)

如何手动处理缩进和key: value格式:

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

对于嵌套地图,您需要一个

的方法
  • 接受当前"等级"筑巢将level选项卡放在输出前面以提供正确的输出嵌套
  • 检查每个条目。如果它是另一种集合类型,则需要递归调用自身 - 这将增加缩进级别