2014-10-02 87 views
0

我們在整個應用程序中使用jackson來將Java對象序列化並反序列化爲JSON。它效果很好。如何僅序列化帶有自定義註釋註釋的屬性

是否有可能通過自定義序列化程序來序列化僅使用自定義註釋進行註釋的Java對象的屬性?

因此,考慮到自定義註釋:

public @interface SpecialField {} 

而下面豆

public SomeBean { 
    @SpecialField 
    private Object propertyIncluded; 

    private Object propertyExcluded; 
} 

將自定義序列(或某些等效機制)是什麼樣子序列化propertyIncluded(使用正常的傑克遜對象映射器)並忽略propertyExcluded?

我們不能在這個用例中使用標準jackson annotations(@JsonIgnore),因爲它會破壞我們在應用程序中的其他序列化用例。

+0

你可以讓jackson符合transient關鍵字,或者使用@JsonIgnore檢查一下:http://stackoverflow.com/questions/21745593/why-jackson-is-serializing-transient-member-also – 2014-10-02 23:07:35

+0

看起來好像你的答案可能會在這裏http://stackoverflow.com/questions/7105745/how-to-specify-jackson-to-only-use-fields-preferably-globally – user3784915 2014-10-02 23:20:58

+0

我們不能使用@JsonIgnore這個用例作爲它會破壞我們對Jackson的其他用途,將這些對象序列化。 – 2014-10-02 23:26:03

回答

0

雖然這可能不是你想要的,但可以通過一些調整使傑克遜引擎序列化對象。在我下面的例子中,我創建了兩種類型的序列化器,它們將會或不會序列化標記爲瞬態的字段。

import java.io.Serializable; 

import org.codehaus.jackson.annotate.JsonAutoDetect; 
import org.codehaus.jackson.map.ObjectMapper; 

public class Test { 

    public static void main(String[] args) throws Exception { 
     ISerializer d = new Doesnt(); 
     ISerializer o = new Observes(); 

     SomeObject obj = new SomeObject(); 

     System.out.println("Doesnt: " + d.serialize(obj)); 

     System.out.println("Observes: " + o.serialize(obj)); 
    } 
    public static class Doesnt implements ISerializer<SomeObject> { 

     @Override 
     public String serialize(SomeObject o) throws Exception { 
      ObjectMapper om = new ObjectMapper(); 
      om.setVisibilityChecker(
        om.getSerializationConfig(). 
        getDefaultVisibilityChecker(). 
        withFieldVisibility(JsonAutoDetect.Visibility.ANY). 
        withGetterVisibility(JsonAutoDetect.Visibility.ANY)); 
      return om.writeValueAsString(o); 
     } 

    } 

    public static class Observes implements ISerializer<SomeObject> { 

     @Override 
     public String serialize(SomeObject o) throws Exception { 
      ObjectMapper om = new ObjectMapper(); 
      om.setVisibilityChecker(
        om.getSerializationConfig(). 
        getDefaultVisibilityChecker(). 
        withFieldVisibility(JsonAutoDetect.Visibility.ANY). 
        withGetterVisibility(JsonAutoDetect.Visibility.NONE)); 
      return om.writeValueAsString(o); 
     }  
    } 
    public interface ISerializer<T> { 
     public String serialize(T o) throws Exception; 
    } 

    public static class SomeObject implements Serializable { 
     private static final long serialVersionUID = 745063791749142843L; 
     private transient String myVar = "Transient"; 
     private String myOther = "Not Transient"; 
     public String getMyVar() { 
      return myVar; 
     } 
     public void setMyVar(String myVar) { 
      this.myVar = myVar; 
     } 
     public String getMyOther() { 
      return myOther; 
     } 
     public void setMyOther(String myOther) { 
      this.myOther = myOther; 
     } 
    } 
} 

輸出:

Doesnt: {"myVar":"Transient","myOther":"Not Transient"} 
Observes: {"myOther":"Not Transient"} 

我認爲這將是相當容易改變串行擴展JsonSerializer類,並做他們類似的事情。

+0

這樣做(使用mapper可見性設置)需要我們對我們的Java進行結構性更改,將我們的代碼緊密結合到這個特定的序列化案例中。這裏涉及很多實體,這是一個橫切關注點,所以我們希望儘可能使用註釋完成它。我看到傑克遜ContextualSerializer檢查註釋,我會去使用它來做基於自定義註釋的條件序列化。 – 2014-10-03 12:01:09