1

私は、いくつかのケースクラスに混在する単純な特性を持っています。そのクラスのインスタンスを circe 経由で JSON に変換するときに、特性のデフォルト値を持つフィールドが JSON 文字列に含まれていないことに気付きました。

io.circe.generic.auto._エンコードに使用しています

それを説明する例:

  trait Base {
    var timestamp: Timestamp = new Timestamp(System.currentTimeMillis())
    var version = 0
  }

  case class CC(id: String) extends Base

  val cc = CC("testId")
  val str = cc.asJson.noSpaces

与える:{"id":"testId"}

したがってstr、私が期待するタイムスタンプとバージョンの値が含まれていません

ケースクラスにエンコーダーを使用し、特性をスキップするだけだと思います。それらのフィールドも含めるにはどうすればよいですか?

Circeの異なるバージョン(0.3.0および0.6.0)でこれを試しました

また、後で JSON 文字列からそのフィールド (別の値を持つことができる) をデコードできますか、またはこのフィールドを抽象のままにして、ケース クラスでデフォルトの引数を使用する必要がありますか?

4

1 に答える 1

1

これらのフィールドを CC ケース クラスに直接追加するか、独自のエンコーダを明示的に定義する必要があります。

私はこのようなことをします:

  trait Base {
    def timestamp: Timestamp
    def version: Int
  }

  case class CC(id: String, timestamp: Timestamp, version: Int) 
    extends Base

  object CC {
    def apply(id: String) = new CC(
      id, new Timestamp(System.currentTimeMillis()), 0
    )
  }

  val cc = CC("testId")
  val str = cc.asJson.noSpaces
于 2016-11-17T19:25:39.187 に答える