与YAML一起使用Scala

アレッ*_*ックス 29 yaml scala

我为这个https://github.com/daltontf/scala-yaml找到了一个库,但似乎没有多少开发人员使用它,而且它已经过时了.它也可能是这个http://www.lag.net/configgy/如果链接没有死.

我想知道,在Scala中使用YAML最受欢迎或事实上的库是什么?

Gre*_*pff 24

以下是使用Jackson YAML数据绑定的示例.

首先,这是我们的示例文档:

name: test
parameters:
  "VERSION": 0.0.1-SNAPSHOT

things:
  - colour: green 
    priority: 128
  - colour: red
    priority: 64
Run Code Online (Sandbox Code Playgroud)

添加这些依赖项:

libraryDependencies ++= Seq(
  "com.fasterxml.jackson.core" % "jackson-core" % "2.1.1",
  "com.fasterxml.jackson.core" % "jackson-annotations" % "2.1.1",
  "com.fasterxml.jackson.core" % "jackson-databind" % "2.1.1",
  "com.fasterxml.jackson.dataformat" % "jackson-dataformat-yaml" % "2.1.1"
)
Run Code Online (Sandbox Code Playgroud)

这是我们最外层的类(Preconditions是类似番石榴的检查,如果所述字段不在YAML中,则会引发异常):

import java.util.{List => JList, Map => JMap}
import collection.JavaConversions._
import com.fasterxml.jackson.annotation.JsonProperty

class Sample(@JsonProperty("name") _name: String,
             @JsonProperty("parameters") _parameters: JMap[String, String],
             @JsonProperty("things") _things: JList[Thing]) {
  val name = Preconditions.checkNotNull(_name, "name cannot be null")
  val parameters: Map[String, String] = Preconditions.checkNotNull(_parameters, "parameters cannot be null").toMap
  val things: List[Thing] = Preconditions.checkNotNull(_things, "things cannot be null").toList
}
Run Code Online (Sandbox Code Playgroud)

这是内在的对象:

import com.fasterxml.jackson.annotation.JsonProperty

class Thing(@JsonProperty("colour") _colour: String,
            @JsonProperty("priority") _priority: Int {
  val colour = Preconditions.checkNotNull(_colour, "colour cannot be null")
  val priority = Preconditions.checkNotNull(_priority, "priority cannot be null")
}
Run Code Online (Sandbox Code Playgroud)

最后,这是如何实例化它:

 val reader = new FileReader("sample.yaml")
 val mapper = new ObjectMapper(new YAMLFactory())
 val config: Sample = mapper.readValue(reader, classOf[Sample])
Run Code Online (Sandbox Code Playgroud)


Ami*_*ico 23

SnakeYAML是一个高质量,积极维护的Java YAML解析器/渲染器.你当然可以在Scala中使用它.

如果你真的想要这种方便,HelicalYAMLSnakeYAML提供了Scala包装器,但我无法证明项目的质量或寿命.

我希望看到一个库可以将JSON或YAML(或其他任何 - 可插入的)解析为常见的AST,然后使用类型类构造Scala对象.几个JSON库就是这样工作的(当然也可以使用相同的类型类为对象渲染JSON),但我不知道YAML的这种工具.

  • 对我来说,使用SnakeYAML的主要缺点是,如果要使用反射进行自动解析,则只能使用java集合序列化可变类.这让我写了2个班.不可变的一个用在代码和beany-one中有@BeanProperties并使用带有构建方法的java集合来构造不可变的伴随.我错过了什么?也许有一些基于宏的元编程解决方案让我免于双重编码? (2认同)

Gau*_*mar 22

派对有点晚,但我认为这种方法以最无缝的方式运作.这种方法有:

  1. 自动转换为scala集合类型
  2. 用例类
  3. 不需要像BeanProperty/JsonProperty这样的样板代码
  4. 使用Jackson-YAMLJackson-scala

码:

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

case class Prop(url: List[String])

// uses Jackson YAML to parsing, relies on SnakeYAML for low level handling
val mapper: ObjectMapper = new ObjectMapper(new YAMLFactory())

// provides all of the Scala goodiness
mapper.registerModule(DefaultScalaModule)
val prop: Prop = mapper.readValue("url: [abc, def]", classOf[Prop])

// prints List(abc, def)
println(prop.url)
Run Code Online (Sandbox Code Playgroud)

  • 3年***晚**这个*主题 - 因为它仍然不是一个完全解决的问题.我正在成功使用上面给定的库,但继续遇到特定的陷阱. (3认同)

aka*_*ppi 5

我今天遇到了moultingyaml.

MoultingYAML是基于spray-json的SnakeYAML的Scala包装器.

与我共事多年后,我看起来很熟悉spray-json.我认为它可能适合@ sihil需要一个"引人注目"和"成熟"的Scala YAML库.


小智 5

现在我们有circe-yaml https://github.com/circe/circe-yaml

SnakeYAML提供了一个Java API,用于解析YAML并将其结构编组为JVM类。但是,您可能会发现使用circe编组到Scala ADT中的方法更好-使用编译时指定或派生而不是运行时反射。这使您能够将YAML解析为Json,并使用现有(或大约圆圈的)解码器来执行ADT编组。您还可以使用circe的Encoder获取Json,然后使用此库将其打印到YAML。