Джексон не сериализует поле, определенное `def` - PullRequest
0 голосов
/ 25 июня 2019

Следуя подходу в Easy JSON (un) сортировки в Scala с Джексоном , я определил JsonUtil класс:

import com.fasterxml.jackson.databind.{DeserializationFeature, JsonNode, ObjectMapper}
import com.fasterxml.jackson.module.scala.DefaultScalaModule
import com.fasterxml.jackson.module.scala.experimental.ScalaObjectMapper

object JsonUtil {
  val mapper = new ObjectMapper() with ScalaObjectMapper
  mapper.registerModule(DefaultScalaModule)
  mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
  mapper.enable(DeserializationFeature.USE_LONG_FOR_INTS)

  def toJsonNode[T](elem: T): JsonNode = mapper.valueToTree(elem)
}

А теперь я хочу сериализовать класс, содержащий Int и еще один Int с двойным значением:

import JsonUtil.toJsonNode

trait X {
  def x: Int
  def doubleX: Int = x * 2
}

case class Three() extends X {
  val x = 3
}

println(toJsonNode(Three()))
// {"x":3}
println(Three().doubleX)
// 6

Я понимаю, что Джексон может не распознать поле, определенное def. Однако определение doubleX с помощью def вместо val гарантирует, что его значение всегда будет правильным. Любой обходной путь, чтобы сделать def и Джексона совместимым?

1 Ответ

2 голосов
/ 26 июня 2019

def не определяет поле, это метод.Просто аннотируйте def с помощью @JsonProperty, и Джексон должен рассматривать его как получатель "логического свойства".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...