このhttps://github.com/daltontf/scala-yamlのライブラリを 1 つ見つけましたが、それを使用する開発者は多くないようで、かなり古くなっています。リンクが切れていなければ、これはhttp://www.lag.net/configgy/かもしれません。
Scala で YAML を操作するための最も一般的な、または事実上のライブラリは何ですか?
このhttps://github.com/daltontf/scala-yamlのライブラリを 1 つ見つけましたが、それを使用する開発者は多くないようで、かなり古くなっています。リンクが切れていなければ、これはhttp://www.lag.net/configgy/かもしれません。
Scala で YAML を操作するための最も一般的な、または事実上のライブラリは何ですか?
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])
パーティーには少し遅れましたが、この方法が最もシームレスに機能すると思います。このメソッドには次のものがあります。
コード:
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)
SnakeYAMLは、Java 用の高品質で積極的にメンテナンスされている YAML パーサー/レンダラーです。もちろんScalaからも使えます。
既に circe を使用している場合は、SnakeYAMLを使用して YAML ファイルを解析し、結果を circe AST に変換するcirce-yamlに興味があるかもしれません。
JSON や YAML (またはプラグイン可能なもの) を共通の AST に解析し、型クラスを使用して Scala オブジェクトを構築できるライブラリが欲しいと思っています。いくつかの JSON ライブラリはそのように機能します (もちろん、同じ型クラスを使用してオブジェクトの JSON をレンダリングすることもできます) が、YAML のそのような機能については知りません。
追伸: SnakeYAML の見掛け上放棄されたラッパー、つまりHelicalYAMLとyaml4sもいくつかあるようです。
今日moultingyamlに出会いました。
MoultingYAML は、spray-json に基づく SnakeYAML の Scala ラッパーです。
と何年も一緒に働いてきた私には、とてもなじみがあるように見えますspray-json
。「説得力のある」「成熟した」Scala YAMLライブラリに対する@sihilのニーズに合うかもしれないと思います。
この回答に出くわし、ヘルプと例を探している他の人のために、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)
}
}
そのため、コメントするほどの評判はありませんが(41 atm)、私の経験は言及する価値があると思いました。
このスレッドを読んだ後、Jackson YAML パーサーを使用することにしました。これは、引数のないコンストラクターが必要なく、はるかに読みやすいためです。私が気付いていなかったのは、継承 (マージ) のサポートがなく、アンカー参照のサポートが限られていることです (それが YAML の要点ではありませんか??)。
マージについてはこちらで説明しています。
アンカー参照については、こちらで説明しています。複雑なアンカー参照がサポートされているように見えますが、単純なケースでは機能しませんでした。
私の経験では、Scala の JSON ライブラリはより成熟していて使いやすいです (ケース クラスの処理やカスタム シリアライザーとデシリアライザーの作成に関しては、YAML アプローチのどれも非常に説得力があり、JSON の同等物ほど成熟していません)。
そのため、私は YAML から JSON に変換してから JSON ライブラリを使用することを好みます。これは少しおかしなことに聞こえるかもしれませんが、次の条件を満たしていれば、非常にうまく機能します。
YAML から JSON への変換に使用するアプローチでは、Jackson を活用しています。
val tree = new ObjectMapper(new YAMLFactory()).readTree(yamlTemplate)
val json = new ObjectMapper()
.writer(new DefaultPrettyPrinter().withoutSpacesInObjectEntries())
.writeValueAsString(tree)