[SCALA] 볼품를 사용하는 경우 클래스에 맵 [문자열, 어떤] 변환
SCALA볼품를 사용하는 경우 클래스에 맵 [문자열, 어떤] 변환
여기에서 문제는지도 [문자열, 모든]에 케이스 클래스를 매핑에 대해 묻습니다. 나는 경우 클래스에 맵 [문자열, 어떤]를 변환, 다른 방법으로 주위 어떻게 될지 궁금 해서요. 다음지도를 감안할 때 :
val mp = Map("name" -> "Tom", "address" -> Map("street" -> "Jefferson st", "zip" -> 10000))
사람의 경우 클래스로 변환 :
case class Person(name:String, address:Address)
case class Address(street:String, zip:Int)
val p = Person("Tom", Address("Jefferson st", 10000))
이 같은 뭔가 :
val newP = mp.asCC[Person]
assert(newP.get == p)
어떻게 볼품으로 그렇게해야한다.
해결법
-
==============================
1.여기에 즉석 대부분 검증되지 않은 솔루션입니다. 유형 클래스의 첫 번째 :
여기에 즉석 대부분 검증되지 않은 솔루션입니다. 유형 클래스의 첫 번째 :
import shapeless._, labelled.{ FieldType, field } trait FromMap[L <: HList] { def apply(m: Map[String, Any]): Option[L] }
그리고 인스턴스 :
trait LowPriorityFromMap { implicit def hconsFromMap1[K <: Symbol, V, T <: HList](implicit witness: Witness.Aux[K], typeable: Typeable[V], fromMapT: Lazy[FromMap[T]] ): FromMap[FieldType[K, V] :: T] = new FromMap[FieldType[K, V] :: T] { def apply(m: Map[String, Any]): Option[FieldType[K, V] :: T] = for { v <- m.get(witness.value.name) h <- typeable.cast(v) t <- fromMapT.value(m) } yield field[K](h) :: t } } object FromMap extends LowPriorityFromMap { implicit val hnilFromMap: FromMap[HNil] = new FromMap[HNil] { def apply(m: Map[String, Any]): Option[HNil] = Some(HNil) } implicit def hconsFromMap0[K <: Symbol, V, R <: HList, T <: HList](implicit witness: Witness.Aux[K], gen: LabelledGeneric.Aux[V, R], fromMapH: FromMap[R], fromMapT: FromMap[T] ): FromMap[FieldType[K, V] :: T] = new FromMap[FieldType[K, V] :: T] { def apply(m: Map[String, Any]): Option[FieldType[K, V] :: T] = for { v <- m.get(witness.value.name) r <- Typeable[Map[String, Any]].cast(v) h <- fromMapH(r) t <- fromMapT(m) } yield field[K](gen.from(h)) :: t } }
그리고 편의를 위해 도우미 클래스 :
class ConvertHelper[A] { def from[R <: HList](m: Map[String, Any])(implicit gen: LabelledGeneric.Aux[A, R], fromMap: FromMap[R] ): Option[A] = fromMap(m).map(gen.from(_)) } def to[A]: ConvertHelper[A] = new ConvertHelper[A]
그리고 예 :
case class Address(street: String, zip: Int) case class Person(name: String, address: Address) val mp = Map( "name" -> "Tom", "address" -> Map("street" -> "Jefferson st", "zip" -> 10000) )
그리고 마지막으로:
scala> to[Person].from(mp) res0: Option[Person] = Some(Person(Tom,Address(Jefferson st,10000)))
회원 Typeable 또는 구성원 Typeable 또는 다른 경우 클래스 중 하나를 다른 경우 클래스 중 하나입니다 ... (등)의 경우 클래스에 대한이 의지 만 작동합니다.
주의이 위를 깰 것 같은, 당신의 수입에 scala.reflect.runtime.universe._을하지.
from https://stackoverflow.com/questions/31640565/converting-mapstring-any-to-a-case-class-using-shapeless by cc-by-sa and MIT license
'SCALA' 카테고리의 다른 글
[SCALA] 어떻게 스칼라에 열거하는 방법을 추가? (0) | 2019.11.15 |
---|---|
[SCALA] 스칼라 세트 같은 요소를 포함하지만, sameElements ()는 false를 돌려줍니다 (0) | 2019.11.15 |
[SCALA] 스칼라 2.8에 대한 어떤 IDE? (0) | 2019.11.15 |
[SCALA] 스칼라 선물에 의해 반환 된 액세스 값 (0) | 2019.11.15 |
[SCALA] 분리 대 검증 (0) | 2019.11.15 |