首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Scala:使用SnakeYaml解析Yaml文件

Scala:使用SnakeYaml解析Yaml文件
EN

Stack Overflow用户
提问于 2015-06-15 17:17:05
回答 2查看 8.1K关注 0票数 0

我对scala很陌生。我试图使用scala中的snakeyaml解析Yaml文件。我正在获取数据,但它是以对象的形式出现的。我可以转换对象ot字符串,但它违背了使用Yaml的全部目的。

我使用的文件是带有数据的"abcd.yaml“

代码语言:javascript
运行
复制
aa:
  - x
  - y
bb: z

我的代码是这样的:

代码语言:javascript
运行
复制
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)
}

但是这里我得到了一个对象,我不能使用里面的值。有解决办法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-06-15 20:49:11

我得到了解决方案,就是转换为java映射,而不是scala映射:

只要使用asInstanceOf[java.util.Map[String, Any],它就像一种魅力。解决方案是像这样调用load:

代码语言:javascript
运行
复制
    val obj = yaml.load(ios).asInstanceOf[java.util.Map[String, Any]]
票数 4
EN

Stack Overflow用户

发布于 2020-08-16 02:59:39

为了解压缩单个级别的YAML文件,如

代码语言:javascript
运行
复制
aa:
 - x
 - y
bb: z

解决方案是将其转换为您希望在解压缩YAML文件之后接收的数据类型,即地图,通常最首选的是MapString,Any以适应检索到的任何数据类型。

代码语言:javascript
运行
复制
val obj = yaml.load(ios).asInstanceOf[java.util.Map[String, Any]]

这是最简单的解决方案,但是,当YAML文件中有多个级别时,就很难使用该方法,然后每次您更深一步时,就必须将新对象强制转换为Map/List。例如YAML档案:

代码语言:javascript
运行
复制
aa:
 - x
 - y
bb: z
cc:
  p: abc
  q: 123
  r: true
  s:
    - listItem1
    - listItem2
    - listItem3

在这种情况下,依赖SnakeYAML解析文件和依赖Jackson遍历文件是最好的,因为我们在杰克逊的JsonNode数据类型中具有灵活性

代码语言:javascript
运行
复制
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的at或get方法解析JsonNode:

代码语言:javascript
运行
复制
jsonObj.at("/cc/r").asBoolean // Returns boolean of value in r
jsonObj.get("bb") // Returns the value in key bb

利用asText、asBoolean、asInt等方法在JsonNode中使用,可以简化数据提取和类型转换过程。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30851141

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档