2013-06-05 12 views
5

Sono nuovo di Java e Jackson e molte altre tecnologie che cerco di utilizzare, quindi apprezzerei una risposta dettagliata.Impostazioni di codice equivalenti per @JSonIgnore

C'è un modo per impedire che uno o più campi vengano serializzati usando Jackson in un formato JSon String_like, ma senza utilizzare alcun tipo di annotazione JSon?

Qualcosa come mapper.getSerializationConfig(). qualcosa (ignora ("displayname")) se sai cosa intendo. Il mio oggetto è un'istanza di una classe che ne estende un'altra e implementa un'interfaccia anche in questo modo, quindi i campi provengono da una gerarchia di classi. Ho bisogno della rappresentazione JSon per quell'oggetto ma contiene solo determinati campi, quindi posso inviare quel JSON in una richiesta fittizia tramite un metodo POST. Sto usando Jackson 2.2.2. Grazie in anticipo.

+0

Se è possibile modificare la classe principale o l'interfaccia, poi basta usare la parola 'transient' nella tua dichiarazione sul campo. I campi transitori non saranno serializzati. Ad es: 'test transitorio pubblico int;' –

+0

Grazie per la risposta, ma non riesco a toccare la classe principale. Altrimenti userei l'annotazione JSonIgnore sui campi specifici e tutto sarebbe risolto. – niceman

+0

Questo è ciò che temo, quindi puoi provare a utilizzare la visualizzazione come in questo esempio: http://stackoverflow.com/a/8477588/1140748. –

risposta

5

Se non è possibile modificare le classi, è possibile creare una nuova classe/interfaccia astratta che contenga metodi con annotazione @JsonIgnore. In questa classe/interfaccia è possibile definire i metodi che devono essere saltati durante il processo di serializzazione/deserializzazione nel modo ObjectMapper.

prega, vedere il mio piccolo esempio:

import java.io.IOException; 

import com.fasterxml.jackson.annotation.JsonIgnore; 
import com.fasterxml.jackson.databind.ObjectMapper; 

public class JacksonProgram { 

    public static void main(String[] args) throws IOException { 
     Person person = new Person(); 
     person.setId(1L); 
     person.setName("Max"); 

     ObjectMapper objectMapper = new ObjectMapper(); 
     objectMapper.addMixInAnnotations(Person.class, PersonMixIn.class); 

     System.out.println(objectMapper.writeValueAsString(person)); 
    } 
} 

abstract class Entity { 

    private Long id; 

    public Long getId() { 
     return id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 
} 

interface Namamble { 
    String getName(); 
} 

class Person extends Entity implements Namamble { 

    private String name; 

    @Override 
    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 
} 

interface PersonMixIn { 
    @JsonIgnore 
    String getName(); 
} 

EDIT - risposta per i commenti

È possibile creare tale interfaccia mixin:

public static interface UserInformationMixIn { 
    @JsonIgnore 
    String getField3(); 
} 

e configurare ObjectMapper in questo modo :

objectMapper.addMixInAnnotations(UserInformation.class, UserInformationMixIn.class); 

codice completo sorgente di esempio:

import java.io.IOException; 

import com.fasterxml.jackson.annotation.JsonIgnore; 
import com.fasterxml.jackson.databind.ObjectMapper; 

public class JacksonProgram { 

    public static void main(String[] args) throws IOException { 
     UserInformation userInformation = new UserInformation(); 
     userInformation.setField3("field3"); 
     userInformation.setField4("field4"); 
     userInformation.setField5("field5"); 

     User user = new User(); 
     user.setField1(userInformation); 
     user.setField2("field2"); 

     ObjectMapper objectMapper = new ObjectMapper(); 
     objectMapper.addMixInAnnotations(UserInformation.class, UserInformationMixIn.class); 
     objectMapper.addMixInAnnotations(User.class, UserInformationMixIn.class); 

     System.out.println(objectMapper.writeValueAsString(user)); 
    } 

    public static abstract class Someclass { 
     String field5; 

     public String getField5() { 
      return field5; 
     } 

     public void setField5(String field5) { 
      this.field5 = field5; 
     } 
    } 

    public static class UserInformation extends Someclass { 
     String field3; 
     String field4; 

     public String getField3() { 
      return field3; 
     } 

     public void setField3(String field3) { 
      this.field3 = field3; 
     } 

     public String getField4() { 
      return field4; 
     } 

     public void setField4(String field4) { 
      this.field4 = field4; 
     } 
    } 

    public static class User { 
     UserInformation field1; 
     String field2; 

     public UserInformation getField1() { 
      return field1; 
     } 

     public void setField1(UserInformation field1) { 
      this.field1 = field1; 
     } 

     public String getField2() { 
      return field2; 
     } 

     public void setField2(String field2) { 
      this.field2 = field2; 
     } 
    } 

public static interface UserInformationMixIn { 
    @JsonIgnore 
    String getField3(); 

    @JsonIgnore 
    String getField2(); 

    @JsonIgnore 
    String getField5(); 
} 
} 

Link utili:

+0

Grazie, mykhaylo, proverò a seguire il tuo esempio. – niceman

+0

classe astratta Someclass { Campo stringa5; } classe UserInformation estende SomeClass { \t Campo stringa3; \t Campo stringa4; } classe Utente { \t UserInformation campo1; \t Stringa \t \t campo2; } – niceman

+0

Ci scusiamo per la formattazione, come posso serializzare il campo1 ma senza campo3 utilizzando le classi di mixaggio?È una struttura di classe un po 'più complicata, ma se mi rispondi alla domanda, potrei adattarmi facilmente. Grazie ancora. – niceman

Problemi correlati