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

时间:2015-04-07 07:07:12

标签: json scala jackson

我试图在下面的示例中排除_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
      }
    }
  }
}

1 个答案:

答案 0 :(得分:1)

我认为你可以使用像@JsonIgnore这样的东西来排除它,或者使场成为瞬态。

否则,如果您需要在案例类代码之外定义它(如您的示例中所示),则可以使用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的作者。