32

このhttps://github.com/daltontf/scala-yamlのライブラリを 1 つ見つけましたが、それを使用する開発者は多くないようで、かなり古くなっています。リンクが切れていなければ、これはhttp://www.lag.net/configgy/かもしれません。

Scala で YAML を操作するための最も一般的な、または事実上のライブラリは何ですか?

4

8 に答える 8

27

Jackson YAMLデータバインディングの使用例を次に示します。

まず、サンプル ドキュメントを次に示します。

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

things:
  - colour: green 
    priority: 128
  - colour: red
    priority: 64

次の依存関係を追加します。

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"
)

これが最も外側のクラスです (Preconditions は Guava のようなチェックであり、上記のフィールドが 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
}

内部オブジェクトは次のとおりです。

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")
}

最後に、インスタンス化する方法は次のとおりです。

 val reader = new FileReader("sample.yaml")
 val mapper = new ObjectMapper(new YAMLFactory())
 val config: Sample = mapper.readValue(reader, classOf[Sample])
于 2014-03-17T08:21:45.507 に答える
26

パーティーには少し遅れましたが、この方法が最もシームレスに機能すると思います。このメソッドには次のものがあります。

  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)
于 2016-04-24T09:19:20.837 に答える
24

SnakeYAMLは、Java 用の高品質で積極的にメンテナンスされている YAML パーサー/レンダラーです。もちろんScalaからも使えます。

既に circe を使用している場合はSnakeYAMLを使用して YAML ファイルを解析し、結果を circe AST に変換するcirce-yamlに興味があるかもしれません。

JSON や YAML (またはプラグイン可能なもの) を共通の AST に解析し、型クラスを使用して Scala オブジェクトを構築できるライブラリが欲しいと思っています。いくつかの JSON ライブラリはそのように機能します (もちろん、同じ型クラスを使用してオブジェクトの JSON をレンダリングすることもできます) が、YAML のそのような機能については知りません。


追伸: SnakeYAML の見掛け上放棄されたラッパー、つまりHelicalYAMLyaml4sもいくつかあるようです。

于 2013-10-19T01:01:55.033 に答える
6

今日moultingyamlに出会いました。

MoultingYAML は、spray-json に基づく SnakeYAML の Scala ラッパーです。

と何年も一緒に働いてきた私には、とてもなじみがあるように見えますspray-json。「説得力のある」「成熟した」Scala YAMLライブラリに対する@sihilのニーズに合うかもしれないと思います。

于 2016-11-18T13:45:04.433 に答える
4

この回答に出くわし、ヘルプと例を探している他の人のために、snakeYAML を使用する基本的な例を見つけました。コードは次のとおりです。

package yaml

import org.yaml.snakeyaml.Yaml
import org.yaml.snakeyaml.constructor.Constructor
import scala.collection.mutable.ListBuffer
import scala.reflect.BeanProperty

object YamlBeanTest1 {

  val text = """
  accountName: Ymail Account
  username: USERNAME
  password: PASSWORD
  mailbox: INBOX
  imapServerUrl: imap.mail.yahoo.com
  protocol: imaps
  minutesBetweenChecks: 1
  usersOfInterest: [barney, betty, wilma]
  """

  def main(args: Array[String]) {
    val yaml = new Yaml(new Constructor(classOf[EmailAccount]))
    val e = yaml.load(text).asInstanceOf[EmailAccount]
    println(e)
  }

}

/**
 * With the Snakeyaml Constructor approach shown in the main method,
 * this class must have a no-args constructor.
 */
class EmailAccount {
  @BeanProperty var accountName: String = null
  @BeanProperty var username: String = null
  @BeanProperty var password: String = null
  @BeanProperty var mailbox: String = null
  @BeanProperty var imapServerUrl: String = null
  @BeanProperty var minutesBetweenChecks: Int = 0
  @BeanProperty var protocol: String = null
  @BeanProperty var usersOfInterest = new java.util.ArrayList[String]()

  override def toString: String = {
    return format("acct (%s), user (%s), url (%s)", accountName, username, imapServerUrl)
  }
}
于 2014-03-12T23:45:33.130 に答える
4

そのため、コメントするほどの評判はありませんが(41 atm)、私の経験は言及する価値があると思いました。

このスレッドを読んだ後、Jackson YAML パーサーを使用することにしました。これは、引数のないコンストラクターが必要なく、はるかに読みやすいためです。私が気付いていなかったのは、継承 (マージ) のサポートがなく、アンカー参照のサポートが限られていることです (それが YAML の要点ではありませんか??)。

マージについてはこちらで説明しています。

アンカー参照については、こちらで説明しています。複雑なアンカー参照がサポートされているように見えますが、単純なケースでは機能しませんでした。

于 2015-12-11T14:42:48.197 に答える
2

私の経験では、Scala の JSON ライブラリはより成熟していて使いやすいです (ケース クラスの処理やカスタム シリアライザーとデシリアライザーの作成に関しては、YAML アプローチのどれも非常に説得力があり、JSON の同等物ほど成熟していません)。

そのため、私は YAML から JSON に変換してから JSON ライブラリを使用することを好みます。これは少しおかしなことに聞こえるかもしれませんが、次の条件を満たしていれば、非常にうまく機能します。

  • JSONのサブセットであるYAMLのみを使用しています(私の経験では多くのユースケースがあります)
  • パスはパフォーマンス クリティカルではありません (このアプローチを採用するとオーバーヘッドが発生するため)

YAML から JSON への変換に使用するアプローチでは、Jackson を活用しています。

val tree = new ObjectMapper(new YAMLFactory()).readTree(yamlTemplate)

val json = new ObjectMapper()
        .writer(new DefaultPrettyPrinter().withoutSpacesInObjectEntries())
        .writeValueAsString(tree)
于 2016-09-13T18:43:38.607 に答える