Поля признаков Circe, не включенные в json

У меня есть простая черта, которая в некоторых случаях смешивала классы. При преобразовании экземпляров этих классов в JSON через circe я понял, что поля со значениями по умолчанию в trait не включены в строку 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 не содержит значений отметки времени и версии, которые я ожидаю

Я предполагаю, что он использует кодировщик для класса case и просто пропускает черту. Что мне нужно сделать, чтобы включить и эти поля?

Пробовал это в разных версиях circe (0.3.0 и 0.6.0)

Также я могу декодировать эти поля (которые могут иметь другие значения) из строки JSON позже, или мне лучше оставить эти поля абстрактными и использовать аргументы по умолчанию в классах case?


person alpex    schedule 17.11.2016    source источник


Ответы (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
person longshorej    schedule 17.11.2016