2013-08-30 37 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。这个例子帮助我重新格式化我的对象。 –