2017-02-22 5 views
0

YAMLファイルをScalaから読み込もうとしていますが、以下のコードを使用してファイルを読み取ることができます。私がここに見る不利な点の1つは、私が使用しているYAMLファイルとのマッピングを持つcase classを作成する必要があることです。 YAMLの内容を変更するたびに、case classを変更する必要があります。 Scalaで読み取る方法がありますかYAMLcase classを作成する必要があります。 (私はYAMLを読むためにPythonをも使用している。我々はYAML構造でClassをマッピングの制約を持っていない...とScalaで同様のことをしたいと思っている)「case class」なしでScalaのYAMLを読む

:私が追加しますYAMLでの新しいプロパティと私のcase classが整合性を持っていない場合、私はUnrecognizedPropertyException

package yamlexamples 

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

object YamlTest extends App{ 


    case class Prop(country: String, state: List[String]) 

    val mapper: ObjectMapper = new ObjectMapper(new YAMLFactory()) 

    mapper.registerModule(DefaultScalaModule) 
    val fileStream = getClass.getResourceAsStream("/sample.yaml") 
    val prop:Prop = mapper.readValue(fileStream, classOf[Prop]) 

    println(prop.country + ", " + prop.state) 

} 

sample.yaml(これは、コードで動作します)

を取得
country: US 
state: 
    - TX 
    - VA 

sample.yaml(これは例外がスローされます)

country: US 
state: 
    - TX 
    - VA 
continent: North America 

答えて

2

あなたはYAMLファイルを解析し、コレクションではなく、ケースの場合の対象として、それを読み込むことができます。しかし、これはあなたのコードで型保証を失うことになります。以下のコードでは、でサポートされている関数loadを使用しています。

import scala.collection.JavaConverters._ 
val yaml = new Yaml() 
val data = yaml.load(
     """ 
     |country: US 
     |state: 
     | - TX 
     | - VA 
     |continent: North America 
     """.stripMargin).asInstanceOf[java.util.Map[String, Any]].asScala 

次にデータがスカラ可変コレクションの代わりにケースクラス

data: scala.collection.mutable.Map[String,Any] = Map(country -> US, state -> [TX, VA], continent -> North America) 
ある.. loadは同様のInputStream /リーダから読み取る overloaded methodsを有することに留意されたいです
関連する問題