2014-02-06 62 views
0

我有3个case类:创建读取的列表[案例类]

scala> case class Friend(id: Long, hobbies: List[Long]) 
defined class Friend 

scala> case class Kid(friends: List[Friend]) 
defined class Kid 

scala> case class Parent(kids: List[Kid]) 
defined class Parent 

它们可以显示在层次结构(父母有孩子(一个或多个)的朋友(S)有(ID和爱好)。

Parent 
    ---> Kid 
     ---> Friend 
      ---> id: Long 
      ---> hobbies: List[Long] 

我创建了FriendsReads(尽管作为senia指出here,我可能只需要使用

scala> implicit val FriendReads: Reads[Friend] = Json.format[Friend] 
FriendReads: play.api.libs.json.Reads[Friend] = [email protected] 

scala> implicit val FriendReads: Reads[Friend] = (
    | (JsPath \ "id").read[Long] and 
    | (JsPath \ "hobbies").read[List[Long]] 
    |)(Friend.apply _) 
FriendReads: play.api.libs.json.Reads[Friend] = [email protected] 

然后,当我试图创建KidReads时,我遇到了编译时问题。

scala> implicit val KidReads: Reads[Kid] = (
    | (JsPath \ "friends").read[List[Friend]] 
    |)(Kid.apply _) 
<console>:40: error: overloaded method value read with alternatives: 
    (t: List[Friend])play.api.libs.json.Reads[List[Friend]] <and> 
    (implicit r: play.api.libs.json.Reads[List[Friend]])play.api.libs.json.Reads[List[Friend]] 
cannot be applied to (List[Friend] => Kid) 
     (JsPath \ "friends").read[List[Friend]] 
          ^

如何解决此错误?

+0

谢谢,特拉维斯,你是对的。我看到一种新类型,忘记检查你的有用答案。我的错。 –

回答

1

表达(JsPath \ "friends").read[List[Friend]]创建Reads[List[Friend]],你可以使用map方法这样将其转换为Reads[Kid]

implicit val KidReads: Reads[Kid] = 
    (JsPath \ "friends").read[List[Friend]] map Kid.apply 

功能Kid.apply将被应用到结果的Reads[List[Friend]]#reads这样的:

val friendListReads: Reads[List[Friend]] = (JsPath \ "friends").read[List[Friend]] 

implicit val kidReads: Reads[Kid] = new Reads[Kid] { 
    def reads(json: JsValue): JsResult[Kid] = friendListReads.reads(json) match { 
    case JsSuccess(fList, path) = JsSuccess(Kid(fList), path) 
    case e: JsError => e 
    } 
} 
+0

当映射到Reads [List [Friend]]上时,映射函数f具有签名:List [Friend] - > Friend? –

+0

@KevinMeredith:是的。 – senia

+0

我无法推理这个map函数。为什么将Kid.map应用于每个朋友的工作? –