2013-08-30 42 views
2

注:參見代碼在問題的底部看到答案沒有Json的格式化發現型

我添加數據管理部作爲自身的財產清單,並開始得到以下編譯錯誤。它有可能擁有它所在類的屬性嗎?

我得到一個編譯錯誤:

ItemInquiry.scala:21:沒有Json的格式化發現類型列表[models.DataNode。嘗試爲此類型實現隱式格式。 [錯誤](__ \ 「數據節點」).format [列表[數據管理部]

package models 

import play.api.libs.json._ 
import play.api.libs.functional.syntax._ 


case class ItemSearchResult(criteria: String, site: String, searchTime: Int, exact: Boolean, searchResults: List[Item]) 

case class Item(name: String, upc: String, description: String, dataNodes: List[DataNode]) 

case class DataNode(typeVal: String, title: String, subTitle: String, requiredRole: String, dataNodes: List[DataNode]) 


object ItemSearchResult { 

    implicit val dataNode = (
    (__ \ "type"  ).format[String] and 
    (__ \ "title"  ).format[String] and 
    (__ \ "requiredRole").format[String] and 
    (__ \ "subTitle" ).format[String] and 
    (__ \ "dataNodes" ).format[List[DataNode]] 
    )(DataNode.apply _, unlift(DataNode.unapply _)) 

    implicit val item = ((__ \ "name").format[String] and 
    (__ \ "upc").format[String] and 
    (__ \ "description").format[String] and 
    (__ \ "dataNodes").format[List[DataNode]])(Item.apply _, unlift(Item.unapply _)) 

    implicit val itemSearchResult = (
    (__ \ "criteria").format[String] and 
    (__ \ "site").format[String] and 
    (__ \ "searchTime").format[Int] and 
    (__ \ "exact").format[Boolean] and 
    (__ \ "searchResults").format[List[Item]])(ItemSearchResult.apply _, unlift(ItemSearchResult.unapply _)) 
} 

更新,即固定我的問題,確切的代碼:

package models 

import play.api.libs.json._ 
import play.api.libs.functional.syntax._ 


case class ItemSearchResult(criteria: String, site: String, searchTime: Int, exact: Boolean, searchResults: List[Item]) 

case class Item(name: String, upc: String, description: String, dataNodes: List[DataNode]) 

case class DataNode(typeVal: String, title: String, subTitle: String, requiredRole: String, dataNodes: List[DataNode]) 

object ItemSearchResult { 

    implicit val itemSearchResultFormat : Writes[ItemSearchResult] =(
     (__ \'criteria).write[String] and 
     (__ \'site).write[String] and 
     (__ \'searchTime).write[Int] and 
     (__ \'exact).write[Boolean] and 
     (__ \'searchResults).lazyWrite(Writes.traversableWrites[Item](itemFormat)) 
    )(unlift(ItemSearchResult.unapply)) 

    implicit val itemFormat : Writes[Item] =(
     (__ \'name).write[String] and 
     (__ \'upc).write[String] and 
     (__ \'description).write[String] and 
     (__ \'dataNodes).lazyWrite(Writes.traversableWrites[DataNode](dataNodeFormat)) 
    )(unlift(Item.unapply)) 

    implicit val dataNodeFormat : Writes[DataNode] =(
     (__ \'type).write[String] and 
     (__ \'title).write[String] and 
     (__ \'subTitle).write[String] and 
     (__ \'requiredRole).write[String] and 
     (__ \'dataNodes).lazyWrite(Writes.traversableWrites[DataNode](dataNodeFormat)) 
    )(unlift(DataNode.unapply)) 
} 

回答

2

當然,你可以,這是我的代碼工作正常:

在模型:

case class Category(

id : Int, 
name: String, 
subcutegory : List[Category] 
) 

object Category{ 

    implicit val categoryFormat : Writes[Category] =(
    (__ \'id).write[Int] and 
     (__ \'name).write[String]and 
      (__ \'subcategory).lazyWrite(Writes.traversableWrites[Category](categoryFormat)) 
    )(unlift(Category.unapply)) 
} 

所以這裏的關鍵時刻是如何JSO n格式化程序是針對字段subcategory執行的。

這時你不會有任何問題與Json.toJson(....)

+0

感謝您的幫助,以使您的JSON。這個例子幫助我重新格式化我的對象。 –