2

これは、circe をデコーダーとして使用する単純なフィンチ サーバーです。

import com.twitter.finagle.http.RequestBuilder
import com.twitter.io.Buf
import io.circe.generic.auto._
import io.finch._
import io.finch.circe._

case class Test(myValue: Int)

val api = post("foo" :: body.as[Test]) { test: Test => Ok(test) }

val bodyPost = RequestBuilder()
  .url("http://localhost:8080/foo")
  .buildPost(Buf.Utf8("""{ "myValue" : 42 }"""))

api.toService.apply(bodyPost).onSuccess { response =>
  println(s"$response: ${response.contentString}")
}

// output: Response("HTTP/1.1 Status(200)"): {"myValue":42}

を に変更するmyValueOption、すぐに使用でき、上記のコードと同じ結果が得られます。ただし、次のように変更しますscalaz.Maybe

import scalaz.Maybe
case class Test(myValue: Maybe[Int])

結果:

Response("HTTP/1.1 Status(400)"): {"メッセージ":"本文を Test に変換できません: CNil: El(DownField(myValue),true,false)."}

必要なエンコーダー/デコーダーをどのように実装すればよいですか?

4

2 に答える 2

2

可能な実装は次のとおりです。

implicit def encodeDecodeMaybe: Encoder[Maybe[Int]] with Decoder[Maybe[Int]] = new Encoder[Maybe[Int]] with Decoder[Maybe[Int]] {
    override def apply(a: Maybe[Int]): Json = Encoder.encodeInt.apply(a.getOrElse(0)) // zero if Empty
    override def apply(c: HCursor): Decoder.Result[Maybe[Int]] = Decoder.decodeInt.map(s => Just(s)).apply(c)
}
于 2017-02-13T16:46:09.513 に答える