2017-11-20 11 views
2

は、私はこのケースクラスを考えてみましょう:akka-http-jsonキルケケースクラスで使用し、デフォルトのフィールド符号化/復号化のJSON

を使用して/エンコーディングのAPIリクエスト/レスポンスをデコードする際に使用されている

case class Foo(bar: String, baz: Boolean = false)

thisに似た例で

import akka.actor.ActorSystem 
import akka.http.scaladsl.Http 
import akka.http.scaladsl.server.Directives 
import akka.stream.{ ActorMaterializer, Materializer } 
import scala.io.StdIn 

object ExampleApp { 

    private final case class Foo(bar: String, baz: Boolean = false) 

    def main(args: Array[String]): Unit = { 
    implicit val system = ActorSystem() 
    implicit val mat = ActorMaterializer() 

    Http().bindAndHandle(route, "127.0.0.1", 8000) 

    StdIn.readLine("Hit ENTER to exit") 
    system.terminate() 
    } 

    private def route(implicit mat: Materializer) = { 
    import Directives._ 
    import FailFastCirceSupport._ 
    import io.circe.generic.auto._ 

    pathSingleSlash { 
     post { 
     entity(as[Foo]) { foo => 
      complete { 
      foo 
      } 
     } 
     } 
    } 
    } 
} 

これは限りJSONメッセージとして正常に動作税込bazフィールドを参照してください。しかし、私は、jsonメッセージ{bar: "something"}を送信し、結果にbazFooのデフォルト値を使用させたいと考えています。この作業を行うことができるcirceまたはakka-http-jsonの設定はありますか?

また、jsonにエンコードするときにbazフィールドを無視するといいですが、これはそれほど重要ではありません。

編集

私はこのような何かを行うことができます知っている:

implicit val fooEncoder: Encoder[Foo] = new Encoder[Foo] { 
    final def apply(a: Foo): Json = Json.obj(
     ("id", Json.fromString(a.bar)) 
    ) 
    } 

implicit val fooDecoder: Decoder[Foo] = new Decoder[Decoder] { 
    final def apply(c: HCursor): Decoder.Result[Decoder] = 
    for { 
     bar <- c.downField("bar").as[String] 
    } yield { 
     Foo(bar) 
    } 
} 

が、デフォルトのフィールドを必要としない一般的なケースを解決し、より簡単ツー維持解決策を期待していましたjsonメッセージで。

+0

になります。詳細については

は、キルケのリリースノートを参照してください?必要がない場合は「None」に設定しますか? –

+0

@YuvalItzchakovそれは良い提案ですが、このケースでは[quill](http://getquill.io/)でもcaseクラスを使用しています。デフォルトのフィールドはデータベースでは 'NOT NULL'でなければならないので、caseクラスの非オプションとして保持すると良いでしょう。 –

答えて

1

これは、circe-generic-extrasパッケージを使用して実行できます。それはあなたのビルドに入れなければならない独立した依存関係です。 SBTの場合、それはだ:これが発生し、エンコーダは、常にデフォルトのフィールドが含まれます

import io.circe.generic.extras.auto._ 
implicit val customConfig: Configuration = Configuration.default.withDefaults 

libraryDependencies += "io.circe" %% "circe-generic-extras" % "0.8.0" 

次に、あなたのルート機能では、と

import io.circe.generic.auto._ 

を交換してください。 `オプション[ブール]`有効な回避策ことを利用してhttps://github.com/circe/circe/releases/tag/v0.6.0-RC1

関連する問題