Scala:使用 SnakeYaml 解析 Yaml 文件
Scala: Parse a Yaml file using SnakeYaml
我是 Scala 的新手。我试图在 Scala 中使用 snakeyaml 解析 Yaml 文件。我正在获取数据,但它是以对象的形式存在的。我可以将对象转换为字符串,但它破坏了使用 Yaml 的全部目的。
例如我正在使用的文件是 "abcd.yaml" with data
aa:
- x
- y
bb: z
我的代码是这样的:
import java.io.{File, FileInputStream}
import org.yaml.snakeyaml.Yaml
def parseYaml(){
val ios = new FileInputStream(new File("abcd.yaml"))
val yaml = new Yaml()
val obj = yaml.load(ios)
}
但是我在这里得到一个对象,我不能使用里面的值。
有什么解决办法吗?
我找到了解决方案,它是转换为 java 地图而不是 scala 地图:
只需使用 asInstanceOf[java.util.Map[String, Any]
,它就像一个魅力。
解决方法是这样调用load:
val obj = yaml.load(ios).asInstanceOf[java.util.Map[String, Any]]
为了像
一样解压单级 YAML 文件
aa:
- x
- y
bb: z
解决方案是将其转换为您希望在解压 YAML 文件后收到的数据类型,即 Map[ ],通常最优选的是 Map[String, Any] 以适应任何检索到数据类型。
val obj = yaml.load(ios).asInstanceOf[java.util.Map[String, Any]]
这是最简单的解决方案,但是,当 YAML 文件中有多个级别时,此方法变得难以使用,然后您必须将新对象转换为 Map/List,每次执行层次更深。例如 YAML 文件:
aa:
- x
- y
bb: z
cc:
p: abc
q: 123
r: true
s:
- listItem1
- listItem2
- listItem3
在这种情况下,依靠 SnakeYAML 解析文件并依靠 Jackson YAML 遍历文件是最好的,因为我们在 Jackson 的 JsonNode 数据类型中具有灵活性
import java.io.{File, FileInputStream, FileReader}
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory
import com.fasterxml.jackson.module.scala.DefaultScalaModule
import com.fasterxml.jackson.databind.{JsonNode, ObjectMapper}
import org.yaml.snakeyaml.Yaml
// Parsing the YAML file with SnakeYAML - since Jackson Parser does not have Anchors and reference support
val ios = new FileInputStream(new File(yamlFilePath))
val yaml = new Yaml()
val mapper = new ObjectMapper().registerModules(DefaultScalaModule)
val yamlObj = yaml.loadAs(ios, classOf[Any])
// Converting the YAML to Jackson YAML - since it has more flexibility
val jsonString = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(yamlObj) // Formats YAML to a pretty printed JSON string - easy to read
val jsonObj = mapper.readTree(jsonString)
JsonNode可以使用JsonNode的at或get方法解析:
jsonObj.at("/cc/r").asBoolean // Returns boolean of value in r
jsonObj.get("bb") // Returns the value in key bb
利用 JsonNode 中的 asText、asBoolean、asInt 等方法将简化数据提取和类型转换过程
我是 Scala 的新手。我试图在 Scala 中使用 snakeyaml 解析 Yaml 文件。我正在获取数据,但它是以对象的形式存在的。我可以将对象转换为字符串,但它破坏了使用 Yaml 的全部目的。
例如我正在使用的文件是 "abcd.yaml" with data
aa:
- x
- y
bb: z
我的代码是这样的:
import java.io.{File, FileInputStream}
import org.yaml.snakeyaml.Yaml
def parseYaml(){
val ios = new FileInputStream(new File("abcd.yaml"))
val yaml = new Yaml()
val obj = yaml.load(ios)
}
但是我在这里得到一个对象,我不能使用里面的值。 有什么解决办法吗?
我找到了解决方案,它是转换为 java 地图而不是 scala 地图:
只需使用 asInstanceOf[java.util.Map[String, Any]
,它就像一个魅力。
解决方法是这样调用load:
val obj = yaml.load(ios).asInstanceOf[java.util.Map[String, Any]]
为了像
一样解压单级 YAML 文件aa:
- x
- y
bb: z
解决方案是将其转换为您希望在解压 YAML 文件后收到的数据类型,即 Map[ ],通常最优选的是 Map[String, Any] 以适应任何检索到数据类型。
val obj = yaml.load(ios).asInstanceOf[java.util.Map[String, Any]]
这是最简单的解决方案,但是,当 YAML 文件中有多个级别时,此方法变得难以使用,然后您必须将新对象转换为 Map/List,每次执行层次更深。例如 YAML 文件:
aa:
- x
- y
bb: z
cc:
p: abc
q: 123
r: true
s:
- listItem1
- listItem2
- listItem3
在这种情况下,依靠 SnakeYAML 解析文件并依靠 Jackson YAML 遍历文件是最好的,因为我们在 Jackson 的 JsonNode 数据类型中具有灵活性
import java.io.{File, FileInputStream, FileReader}
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory
import com.fasterxml.jackson.module.scala.DefaultScalaModule
import com.fasterxml.jackson.databind.{JsonNode, ObjectMapper}
import org.yaml.snakeyaml.Yaml
// Parsing the YAML file with SnakeYAML - since Jackson Parser does not have Anchors and reference support
val ios = new FileInputStream(new File(yamlFilePath))
val yaml = new Yaml()
val mapper = new ObjectMapper().registerModules(DefaultScalaModule)
val yamlObj = yaml.loadAs(ios, classOf[Any])
// Converting the YAML to Jackson YAML - since it has more flexibility
val jsonString = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(yamlObj) // Formats YAML to a pretty printed JSON string - easy to read
val jsonObj = mapper.readTree(jsonString)
JsonNode可以使用JsonNode的at或get方法解析:
jsonObj.at("/cc/r").asBoolean // Returns boolean of value in r
jsonObj.get("bb") // Returns the value in key bb
利用 JsonNode 中的 asText、asBoolean、asInt 等方法将简化数据提取和类型转换过程