2016-07-27 6 views
4
내가 (json4s 또는 다른 라이브러리 사용) JSON으로 직렬화 할 수있는 능력을 가진 스칼라 케이스 클래스가 있다고 가정

:케이스 클래스 인스턴스화

case class Weather(zip : String, temp : Double, isRaining : Boolean) 

나는 HOCON 설정 파일을 사용하고있는 경우를 :

allWeather { 

    BeverlyHills { 
    zip : 90210 
    temp : 75.0 
    isRaining : false 
    } 

    Cambridge { 
    zip : 10013 
    temp : 32.0 
    isRainging : true 
    } 

} 

자동으로 Weather 개체를 인스턴스화하는 typesafe config를 사용하는 방법은 없나요?

나는 형태

val config : Config = ConfigFactory.parseFile(new java.io.File("weather.conf")) 

val bevHills : Weather = config.getObject("allWeather.BeverlyHills").as[Weather] 

이 솔루션은 "allWeather.BeverlyHills"에 의해 참조 값이 JSON "덩어리"는 사실을 활용할 수있는 무언가를 찾고 있어요.

def configToWeather(config : Config) = 
    Weather(config.getString("zip"), 
      config.getDouble("temp"), 
      config.getBoolean("isRaining")) 

val bevHills = configToWeather(config.getConfig("allWeather.BeverlyHills")) 

을하지만 날씨 정의에 어떤 변화도 configToWeather의 변경을 필요로하기 때문에 그 우아 보인다

나는 분명 내 자신의 파서를 작성할 수 있습니다.

귀하의 검토와 답변에 미리 감사드립니다.

답변

8

typesafe 구성 라이브러리에는 java bean 규칙을 사용하는 config의 API to instantiate 개체가 있습니다. 그러나 케이스 클래스가 그 규칙을 따르지 않는다는 것을 이해합니다.

typesafe 구성을 랩핑하고 찾고있는 스칼라 특정 기능을 제공하는 several scala libraries이 있습니다.

val weather:Try[Weather] = loadConfig[Weather] 

Weather처럼 보일 수 pureconfig 읽기 설정을 사용하여 예를 들어

이 설정 Nazarii의 대답에 확장

+0

+1 for pureconfig. 스프링 부트의 탁월한 [구성 관리] (https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html)에 익숙한 pureconfig는 스칼라에서 찾을 수 있습니다. –

5

의 값의 경우 클래스는 나를 위해 일한 다음 :

import scala.beans.BeanProperty 

//The @BeanProperty and var are both necessary 
case class Weather(@BeanProperty var zip : String, 
        @BeanProperty var temp : Double, 
        @BeanProperty var isRaining : Boolean) { 

    //needed by configfactory to conform to java bean standard 
    def this() = this("", 0.0, false) 
} 

import com.typesafe.config.ConfigFactory 

val config = ConfigFactory.parseFile(new java.io.File("allWeather.conf")) 

import com.typesafe.config.ConfigBeanFactory 

val bevHills = 
    ConfigBeanFactory.create(config.getConfig("allWeather.BeverlyHills"), classOf[Weather]) 
+1

인수가없는 생성자 인'@ BeanPropery'와'var'는 모두이 작업을 수행하는 데 필요합니다. 'var'을 잊어 버리면 구성된 값 대신 빈 값 (생성자에 할당 됨)이 자동으로 나타납니다. –

+0

@StefanL 이에 따라 업데이트되었습니다. 감사합니다. –