首页 > 解决方案 > 杰克逊不序列化由`def`定义的字段

问题描述

按照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

我意识到杰克逊可能无法识别由def. 但是,定义doubleXbydef而不是val确保其值始终正确。任何解决方法可以使def和杰克逊兼容?

标签: jsonscalajackson

解决方案


def没有定义字段,它是一种方法。只需注释defwith @JsonProperty,杰克逊应该将其视为“逻辑属性”的吸气剂。


推荐阅读