2014-04-30 17 views
2

繼承人是傑克遜的問題2.3我沒有可能改變爲其他框架。如何防止傑克遜序列化第三方類中的字段

我想使用傑克遜2.3序列化對象到json。 某些對象來自實現特定(外部)接口的第三方庫。 我想實現的是防止這些對象中的某些字段被序列化。 我無權修改此類,因此@JsonIgnore不會剪切它。 這裏有一個例子

public interface ThirdParty{ 
     public char[] getPassword(); 
     public String getUser(); 
     public Department getDepartment(); 
    } 

我是新來的傑克遜,但有一種感覺,它應該是相當簡單的做這樣的事情

ObjectMapper mapper=new ObjectMapper(); 

    SimpleModule testModule = new SimpleModule("DemoModule",VersionUtil.versionFor(this.getClass())); 
    testModule.addSerializer(ThirdParty.class, new Some_Serializer_That_Can_Ignore_Password())); 
    mapper.registerModule(testModule); 

(我不認爲有什麼叫做一個Some_Serializer_That_Can_Ignore_Password,我想要的是不能序列化該字段的東西) 我不想寫很多代碼來使它工作,我已經看到了舊版傑克遜的相當詳細的例子,但沒有一個用於傑克遜2.3。

謝謝!

+0

您可以使用傑克遜的混入:有些過時的文檔(http://wiki.fasterxml.com/JacksonMixInAnnotations),([關於與傑克遜的兩個例子過時的文檔問題] https://github.com/FasterXML/jackson-docs/issues/2),[SO搜索jackson mixin](http://stackoverflow.com/search?q=jackson+mixin)。 –

回答

1

對於原始問題並非真正的答案,但我找到了排除特定類型的方法,此代碼可確保任何StackTraceElement都不會被序列化。

SimpleModule testModule = new SimpleModule("DemoModule", VersionUtil.versionFor(this.getClass())); 
    testModule.addSerializer(StackTraceElement.class,new JsonSerializer<StackTraceElement>() { 
     @Override 
     public void serialize(StackTraceElement value, JsonGenerator jgen, SerializerProvider provider){/*Do not serialize*/} 
    }); 
    mapper.registerModule(testModule); 
+0

它依然可以成爲贏家,通過這個邏輯,你至少可以量身定製第三方對象的序列化;而不是排除你不想要的東西,你可以包括你想要的東西。但這是最後的手段,因爲它是可怕的微觀管理,因此很難維持。 – Gimby