2017-02-22 5 views
0

YAML 파일을 Scala에서 읽으려고하고 있으며 아래 코드를 사용하여 파일을 읽을 수 있습니다. 여기에서 볼 수있는 단점 중 하나는 내가 사용하고있는 YAML 파일로 매핑하기 위해 case class을 생성해야한다는 것입니다. YAML의 내용을 변경할 때마다 case class을 변경해야합니다. 스칼라에서 YAML을 읽는 방법이 있습니까?case class을 만들 필요가 없습니다. (나는 또한 YAML을 읽을 Python을 사용하고, 우리가 YAML 구조와 Class 매핑의 제약이없는 ... 그리고 Scala 비슷한 일을하고 싶은 경우)'case class'가없는 스칼라에서 YAML 읽기

을 : 나는를 추가 할 때 YAML에서 내 case class 경우 새 속성 내가

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.yamlUnrecognizedPropertyException를 얻을 일치하는 속성이없는

(이 코드와 함께 작동)
country: US 
state: 
    - TX 
    - VA 

(이 예외를 throw)

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

답변

2

수금이 경우 케이스 대신 객체로서 당신은 YAML 파일을 구문 분석하고로드 할 수 있습니다. 그러나 이것은 코드에서 유형 안전성을 잃어 버리는 비용입니다. 아래 코드는 이 지원하는 load 함수를 사용합니다. 이제 데이터가 스칼라 가변 컬렉션 아닌 경우 클래스가 있습니다 .. load뿐만 아니라의 InputStream/리더에서 읽어 overloaded methods이 있는지

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)