2014-10-02 3 views
0

Мы используем jackson в нашем приложении для сериализации и десериализации объектов Java в JSON. Он отлично работает.как только сериализовать свойства, аннотированные пользовательской аннотацией

Возможно ли, возможно, через пользовательский сериализатор сериализовать только свойства объекта Java, которые аннотируются с помощью специальной аннотации?

Таким образом, с учетом аннотаций:

public @interface SpecialField {} 

И следующего боб

public SomeBean { 
    @SpecialField 
    private Object propertyIncluded; 

    private Object propertyExcluded; 
} 

Что бы обычаем сериализатор (или эквивалентный механизм) выглядит как сериализовать propertyIncluded (используя обычный Джексон объект mapper) и игнорировать свойствоExcluded?

Мы не можем использовать стандартные аннотации jackson (@JsonIgnore) в этом прецеденте, так как это разрушит нашу другую сериализацию, использующую случаи в приложении.

+0

Вы можете заставить jackson выполнить ключевое слово переходного процесса или использовать @JsonIgnore, чтобы проверить это: http://stackoverflow.com/questions/21745593/why-jackson-is-serializing-transient-member-also –

+0

Кажется, ваш ответ может быть здесь http://stackoverflow.com/questions/7105745/how-to-specify-jackson-to-only-use-fields-preferably-globally – user3784915

+0

Мы не можем использовать @JsonIgnore для этого варианта использования как это нарушит наши другие применения Джексона, которые сериализуют эти объекты. –

ответ

0

Хотя это может быть и не совсем то, что вы ищете, можно сделать сериализацию объектов Jackson по-разному с помощью некоторой настройки. В моем примере ниже я создаю два типа сериализаторов, которые будут или не будут сериализовать поле, помеченное как переходное.

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

Выполнение этого способа (с настройками видимости карты) требует от нас внести структурные изменения в нашу Java, которые плотно соединяют наш код с этим конкретным случаем сериализации. Здесь много субъектов, и это проблема с перекрестными проблемами, поэтому мы предпочли бы сделать это с аннотациями, если это возможно. Я вижу Jackson ContextualSerializer для проверки аннотаций, я собираюсь использовать это для условной сериализации на основе пользовательской аннотации. –

Смежные вопросы