1

わかりました。まず、ここに質問を投稿するのは初めてなので、気楽に行ってください。

私はこれを理解するためにインターウェブを罵倒したように感じます.私はそれを正しく理解できないので、確かに遅いに違いありません-これは単純であるべきだと知っています.

私はクラスを持っています:

class Produce extends LongKeyedMapper[Produce] with IdPK {
      def getSingleton = Produce
      object producetype extends MappedString(this,20)
      object name extends MappedString(this,20)
      object description extends MappedString(this,255)

    }

オブジェクトには、いくつかのヘルパー メソッドと、これを機能させるために私がまとめたその他のものがいくつかあります。

object Produce extends Produce with LongKeyedMetaMapper[Produce] {
    private implicit val formats = net.liftweb.json.DefaultFormats
    override def fieldOrder = List(producetype, name, description)

    def search(str: String): List[Produce] = {
    val strLC = str.toLowerCase()
    Produce.findAll(By(Produce.producetype, strLC))
    }

    implicit def toJson(item: Produce): JValue = Extraction.decompose(item)
    implicit def toJson(items: List[Produce]): JValue = Extraction.decompose(items)

}

私の休息サービスは基本的なことを行っており、これと一致しています:

serve( "api" / "item" prefix {
    case "search" :: q JsonGet _ =>
      (for {
        searchString <- q ::: S.params("q")
        item <- Produce.search(searchString)
      } yield item): JValue
  })

喜んで、それはうまくいきました、私はそれを一致させました..そしてJsonを返します、問題は次のとおりです: DBにproducetype: aの3つの行があるとしましょう。

[{

},{

},{

}]

だから戻ってきて、データをシリアライズしていないだけです... unapplyメソッドをオーバーロードして、ケースクラスが私を助けることができるかどうかを調べようとしましたが、私の弱い心をクリックしていません. 何か助けはありますか?

4

2 に答える 2

2

ラッパーを追加する必要があると思います。マッパーは少しの助けなしではこれを処理できないようですが、これは他のすべての優れたRESTおよびJson関数と一緒にLiftで行うのは理にかなっています。

次のようなものを作成してから、REST呼び出しでラッパーとマッパーを交換します。

case class ProduceWrapper(producetype: String, name: String, description: String)

object ProduceWrapper {

  private implicit val formats = net.liftweb.json.DefaultFormats

  def apply(in: JValue): Box[ProduceWrapper] = Helpers.tryo{in.extract[ProduceWrapper]}

  def unapply(in: JValue): Option[ProduceWrapper] = apply(in)

  def unapply(in: Any): Option[(String, String, String)] = {
     in match {
        case i: ProduceWrapper => Some((i.producetype, i.name, i.description))
        case _ => None
     }
  }

  implicit def toJson(item: ProduceWrapper): JValue = Extraction.decompose(item)
  implicit def toJson(items: List[ProduceWrapper]): JValue = Extraction.decompose(items)

}

RESTクラスの場合:

serve( "api" / "produce" prefix {
    case Nil JsonPut ProduceWrapper(item) -> _ => Produce.add(item): JValue
}

そして、Produceクラスでは:

  def add(item: ProduceWrapper): ProduceWrapper = {
   Produce.create.name(item.name).description(item.description).save
   item
  }
于 2012-02-01T23:43:14.773 に答える
0

Lift の json サポートにはケース クラスが必要であり、おそらく Mapped オブジェクトでは機能しないと思います。

toJson メソッドで Produce のフィールドを使用して構築されたケース クラスを作成してみてください。

これも役に立ちます。

于 2011-12-25T22:37:49.323 に答える