杰克逊不对`def`

时间:2019-06-25 19:12:56

标签: json scala jackson

按照Easy JSON (un)marshalling in Scala with Jackson中的方法,我定义了一个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

我意识到Jackson可能无法识别def定义的字段。但是,用doubleX而不是def定义val可以确保其值始终正确。是否有使def和Jackson兼容的解决方法?

1 个答案:

答案 0 :(得分:2)

def并未定义字段,而是一种方法。只需用@JsonProperty注释def,Jackson应该将其视为“逻辑属性”的获取者。