2017-08-02 79 views
1

我有两个相同的case类,比方说case类之间的转换具有相同的结构

case class JsonOutput(
    creationDate: ZonedDateTime, 
    updateDate: ZonedDateTime, 
    doctorName: String, 
    patientName: String, 
    userName: String 
) 

case class DbOutput(
    creationDate: ZonedDateTime, 
    updateDate: ZonedDateTime, 
    doctorName: String, 
    patientName: String, 
    userName: String 
) 

其在结构上是相同的,但没有一定的关系(和它们的相似性可能会在未来发生变化)

我想将DbOutput类型,我从数据库中获取到JsonOutput,后来我将用于转换(由Play Json)like

//fullCase is of type JsonOutput 
Ok(Json.obj("case" -> fullCase)) 

我该怎么做?

注:

什么的巢式病例类结构的情况下,要做到:

case class GeneralInfo(number: Int) 

// Nested case class structure 
case class JsonOneOutput(text: String) 
case class JsonThreeOutput(meta: JsonOneOutput, info: GeneralInfo) 

// Nested case class structure  
case class DbOneOutput(text: String) 
case class DbThreeOutput(meta: DbOneOutput, info: GeneralInfo) 

,我不得不再次转换DbOutputJsonOutput(和所有类型相同,除了一些叶节点类型如DbOneOutputJsonOneOutput,它们可以处于较深层次)

回答

1

您似乎想要这样做与无形,所以我建议你看看documentation。如何实现这一点的一个例子是:

import shapeless.Generic 

object FooBar { 

    case class Foo(a: String, b: Int, c: String) 
    case class Bar(x: String, y: Int, z: String) 

    def main(args: Array[String]): Unit = { 
    val genFoo = Generic[Foo] 
    val genBar = Generic[Bar] 

    println(genBar.from(genFoo.to(Foo("foobar", 5, "barfoo")))) 
    } 

} 
+0

我看到这个文档,但如何做到这一点与多个'字符串'类型?它看起来像必须使用'LabelledGeneric',但我不明白如何利用它。 – likern

相关问题