2013-01-13 19 views
5

Utilizziamo la serializzazione JSON con Jackson per esporre lo stato interno del sistema per il debug delle proprietà.Come serializzare i campi transitori usando jackson?

Per impostazione predefinita, jackson non serializza i campi transitori, ma desidero anche serializzarli. Come posso serializzare questi campi?

Un modo che so è fornire un getter per questi campi - ma non voglio farlo, poiché ho alcuni metodi getX che non voglio essere invocato (ad esempio, ci sono alcuni getter che cambia lo stato degli oggetti).

So che potrei creare un'annotazione, ma voglio davvero evitarlo.

Quindi la mia domanda è: C'è un modo per impostare Jackson per serializzare tutti i campi oggetti? includere quelli transitori.

+1

Se si desidera serializzare i campi @ javax.persistence.Transient, vedere [la risposta di Gere] (http://stackoverflow.com/a/29109806/606662): –

+0

d'accordo con @Markus Pscheidt – dirai

risposta

6

Non credo che Jackson supporti alcun tipo di configurazione per abilitare la serializzazione di un campo transitorio. C'è una questione aperta per aggiungere questa funzione, ma è vecchio e non è stato affrontato (per quanto posso dire): http://jira.codehaus.org/browse/JACKSON-623

Quindi la mia domanda è: esiste un modo per impostare Jackson per serializzare tutte i campi degli oggetti? includere quelli transitori.

Quindi per rispondere alla tua domanda, no.

Alcuni altri strumenti Java JSON, ad esempio GSON , supportano un'opzione di configurazione per serializzare i campi transitori. Se è possibile utilizzare un altro strumento, è possibile dare un'occhiata (per GSON, vedere: https://sites.google.com/site/gson/gson-user-guide).

Per espandere un po ', si potrebbe provare un approccio diverso.

In primo luogo, non provare a serializzare un campo transitorio. Dopo tutto, la definizione di transitorio è "non serializzare questo". Tuttavia, posso pensare ad alcune situazioni specifiche in cui potrebbe essere necessario, o almeno conveniente (come quando si lavora con il codice che non è possibile modificare o simili). Eppure, nel 99% dei casi, la risposta è non farlo. Cambia il campo in modo che non sia transitorio se hai bisogno di serializzarlo. Se si dispone di più contesti in cui si utilizza lo stesso campo e si desidera serializzarlo in uno (JSON, ad esempio) e non serializzato in un altro (java.io, ad esempio), è necessario creare un serializzatore personalizzato per il caso in cui non lo vuoi, piuttosto che abusare della parola chiave.

Secondo, per usare un getter e avere "alcuni getter che cambiano lo stato degli oggetti", dovresti cercare di evitare anche quello. Ciò può portare a varie conseguenze non volute. E, tecnicamente, non è un getter, è un setter. Quello che voglio dire è che se muta lo stato, hai un mutatore (setter) piuttosto che un accessore (getter), anche se lo chiami seguendo la convenzione "get" e restituisci qualcosa.

0

È possibile creare un getter personalizzato per quel campo transitorio e utilizzare l'attributo @XmlElement. Non importa il nome di quel getter.

Ad esempio:

public class Person { 

    @XmlTransient private String lastname; 

    @XmlElement(name="lastname") 
    public String getAnyNameOfMethod(){ 
     return lastname; 
    } 

} 
10

La mia soluzione con Jackson 2.4.3:

private static final ObjectMapper mapper = 
     new ObjectMapper(){{ 

      Hibernate4Module module = new Hibernate4Module(); 
      module.disable(Hibernate4Module.Feature.USE_TRANSIENT_ANNOTATION); 
      registerModule(module); 

     }}; 
Problemi correlati