如何在 Jackson json 序列化(Scala)中排除字段

How do you exclude fields in Jackson json serialisation (Scala)

我试图排除下面示例中的 _passthroughFields 属性。当我使用调试器时,我的 PropertyFilter 似乎从未被使用过。我做错了什么?

import java.util

import com.fasterxml.jackson.databind.ser.impl.SimpleBeanPropertyFilter.SerializeExceptFilter
import com.fasterxml.jackson.databind.ser.impl.SimpleFilterProvider
import com.fasterxml.jackson.databind.{DeserializationFeature, ObjectMapper, ObjectWriter}
import com.fasterxml.jackson.module.scala.DefaultScalaModule
import com.fasterxml.jackson.module.scala.experimental.ScalaObjectMapper
import org.scalatest.{Matchers, WordSpec}

import scala.collection.immutable.Map

class PassthroughFieldsSpec extends WordSpec with Matchers {
  "JacksonParser" when {
    "given an Object and undesired fields" should {
      "not include those fields in the json response" in {
        trait Foo {
          def id: String
          def _passthroughFields: Map[String, String] = Map.empty
        }

        class Bar(val id: String, override val _passthroughFields: Map[String, String]) extends Foo

        val item = new Bar("abcd", Map.empty)

        val mapper = new ObjectMapper() with ScalaObjectMapper
        mapper.registerModule(DefaultScalaModule)
        mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)

        val excludes = new util.HashSet[String](1)
        excludes.add("_passthroughFields")
        excludes.add("get_passthroughFields")

        val filters = new SimpleFilterProvider()
          .addFilter("filter properties by name", new SerializeExceptFilter(excludes))

        val writer: ObjectWriter = mapper.writer(filters)

        val json = writer.writeValueAsString(item)
        json.contains("_passthroughFields") shouldBe false
      }
    }
  }
}

我认为您可以使用 @JsonIgnore 之类的东西排除它或使该字段成为瞬态。

否则,如果您需要在案例 class 代码之外定义它(如您的示例),您可以使用 Genson.

import com.owlike.genson._
import com.owlike.genson.reflect.VisibilityFilter

// Note that if you use case classes you don't need the visibility filter stuff
// it is used to indicate that private fields should be ser/de
val genson = new GensonBuilder()
  .withBundle(ScalaBundle())
  .useFields(true, VisibilityFilter.PRIVATE)
  .exclude("_passthroughFields")
  .create()

genson.toJson(item)

免责声明:我是 Gensons 的作者。