2015-04-07 4 views
0

Я пытаюсь исключить свойство _passthroughFields в приведенном ниже примере. Когда я использую отладчик, он выглядит так, как мой PropertyFilter никогда не используется. Что я делаю не так?Как вы исключаете поля в Jackson json serialization (Scala)

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 
     } 
    } 
    } 
} 
+0

Ну, я запустил тестовый сценарий и успешно прошел. Почему вы думаете, что фильтр игнорируется? –

+0

Это не работает, когда я запускаю его. Переменная json содержит '{" id ":" abcd "," _ passthroughFields ": {}}' и по-прежнему содержит '_passthroughFields', который следует исключить. (работает против jackson-module-scala 2.5.1 и scalatest 2.2.4) – reikje

ответ

1

Я думаю, вы можете исключить его, используя что-то вроде @JsonIgnore или сделать поле временным.

В противном случае, если вам необходимо определить его за пределами кода класса case (как в вашем примере), вы можете сделать это с помощью 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.

+0

да класс не под моим контролем. Это класс, созданный scrooge-sbt-plugin (Thrift). Я дам Genson попробовать, выглядит очень красиво - спасибо! – reikje

+0

Отлично, если у вас возникнут какие-либо проблемы, не стесняйтесь сообщать о них в списке рассылки или github – eugen