2

注: 回答を確認するには、質問の下部にあるコードを参照してください

DataNode をそれ自体の List プロパティとして追加したところ、次のコンパイル エラーが発生し始めました。それが属するクラスのプロパティを持つことは可能ですか?

コンパイル エラーが発生します。

ItemInquiry.scala:21: List[models.DataNode] 型の Json フォーマッタが見つかりません。この型の暗黙の Format を実装してみてください。[エラー] (__ \ "dataNodes" ).format[List[DataNode]]

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))
}
4

1 に答える 1

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))
}

したがって、ここでの重要なポイントは、フィールドに対して json フォーマッタがどのように実装されるかですsubcategory

次に、jsonをレンダリングするのに問題はありませんJson.toJson(....)

于 2013-08-30T23:27:26.697 に答える