2012-04-20 22 views
6

Penso che Jackson abbia una serializzazione basata sui metodi, esiste un modo per renderlo basato sul campo?Serializzazione basata sul campo di Jackson

Es:

class Bean { 
    Integer i; 
    String s; 

    public Integer getI() { return this.i; } 
    public void setI(Integer i) { this.i = i; } 
    public bool isSetI() { return this.i != null; } 

    // same for s as well 
} 

L'uscita JSON ha "i" e "Seti". Posso comunque scavalcare questo per ottenere solo "io"? Inoltre sarebbe bello se ci fosse un modo per farlo senza aggiungere annotazioni alla classe (sono generate automaticamente).

+1

Questo codice non viene compilato. Puoi pubblicare il codice che stai utilizzando e come stai tentando di serializzare? –

risposta

5

per raggiungere questo obiettivo senza annotazioni è possibile configurare il ObjectMapper prima di serializzazione/deserializzazione nel seguente modo:

ObjectMapper om = new ObjectMapper(); 
om.setVisibilityChecker(om.getSerializationConfig().getDefaultVisibilityChecker(). 
      withGetterVisibility(JsonAutoDetect.Visibility.NONE). 
      withSetterVisibility(JsonAutoDetect.Visibility.NONE)); 
6

Jackson può usare anche i campi, sì; ma per impostazione predefinita vengono rilevati solo i campi pubblici. Ma puoi usare @JsonProperty per contrassegnare i campi non pubblici.

Una cosa da notare è che se c'è sia un metodo (setX, getX) che un campo (x), il metodo avrà la precedenza. Questo di solito non è un problema, ma se lo è, è necessario disabilitare in modo esplicito i metodi che non devono essere utilizzati, aggiungendo @JsonIgnore ad essi.

10

Controllare l'annotazione @JsonAutoDetect. Esempio:

@JsonAutoDetect(fieldVisibility=Visibility.ANY, getterVisibility=Visibility.NONE, isGetterVisibility=Visibility.NONE, setterVisibility=Visibility.NONE) 
public class Bean { 
    Integer i; 
    String s; 

    Integer getI() { return this.i; } 
    void setI(Integer i) { this.i = i; } 
    bool isSetI() return { this.i == null; } 

    // same for s as well 
} 
3

La risposta accettata non ha prodotto il risultato atteso per me. Ciò che funziona per me senza l'aggiunta di annotazioni è la configurazione del ObjectMapper nel seguente modo:

ObjectMapper om = new ObjectMapper() 
     .setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.NONE) 
     .setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY); 

Questo è il modo in cui sembra avere più senso per me, che utilizza i campi invece di getter \ setter come serializzazione standard di Java sarebbe fare.

Problemi correlati