2012-03-12 12 views
6

Io uso GSON serialize POJO - sia l'oggetto prima che dopo l'alterato.Usa Gson per serializzare un POJO

Quello modificato (chiamalo A) che è stato configurato da Struts2 potrebbe facilmente essere serializzato su Json.

Mentre il POJO prima modificato, ottenuto dal database tramite iBatis (chiamarlo B) non può essere serializzato.

Il messaggio di errore dice: Hai dimenticato di registrare un adattatore di tipo?

Ho letto l'API Gson. Ma non credo che registrare un adattatore di tipo per ogni POJO sia una buona idea. Cosa rende la B non serializzabile?

Scrivo un clone() per il mio POJO e anche l'oggetto clonato da B può essere eseguito.

Questo è fonte di confusione ... C'è qualcuno che potrebbe rispondermi?

prima alterato (clone del B):

{"id":"6429B5329C544711A9848AF243D10E4E","idType":"未选择","firstDate":"Feb 29, 2012 12:00:00 AM","name":"testetes","gender":"男","phone":"553223","city":"未选择","ocup":"未选择","nation":"未选择","famStru":"未选择","infSouc":"未选择","creater":"EE4783A6272A4B62A5CC68DB3C11FE1E","createDate":"Feb 29, 2012 12:00:00 AM","purpose":"未选择","education":"未选择","income":"未选择","cars":"未选择","acptCarpRent":"未选择","acptCarpPrice":"未选择","handStand":"未选择","intentHouse":"未选择","intentArea":"未选择","intentLayout":"未选择","nextDate":"Mar 7, 2012 12:00:00 AM","wuyeType":"未选择","attentionPro":"958B9E093A84415B901900C2DA25C712","ordinaryTraffic":"未选择","attentionPoint":"未选择","buyDate":"未选择","cityArea":"未选择","lastUpdate":"Feb 29, 2012 12:00:00 AM","lastModifier":"EE4783A6272A4B62A5CC68DB3C11FE1E","saler":"A4FB4877DC2945E980477544A955B57F","state":"意向","status":"0"} 

Dopo alterato (A):

{"id":"6429B5329C544711A9848AF243D10E4E","idType":"未选择","firstDate":"Feb 29, 2012 12:00:00 AM","visitMode":"","name":"testetes","gender":"男","telPhone":"","phone":"553223","fax":"","adrs":"","postCode":"","email":"","workUnit":"","city":"未选择","media_id":"","ocup":"未选择","idNum":"","nation":"未选择","famStru":"未选择","infSouc":"未选择","createDate":"Feb 29, 2012 12:00:00 AM","idAdr":"","purpose":"未选择","education":"未选择","income":"未选择","cars":"未选择","acptCarpRent":"未选择","acptCarpPrice":"未选择","handStand":"未选择","intentHouse":"未选择","intentArea":"未选择","intentLayout":"未选择","customerDetail":"","wuyeType":"未选择","attentionPro":"958B9E093A84415B901900C2DA25C712","ordinaryTraffic":"未选择","attentionPoint":"未选择","buyDate":"未选择","cityArea":"未选择","lastUpdate":"Mar 11, 2012 2:58:04 PM","lastModifier":"00000000000000000000000000000000","saler":"A4FB4877DC2945E980477544A955B57F","state":"意向"} 
+0

Si prega di inviare le due stringhe JSON e l'output in entrambi i casi. –

+0

Entrambe le stringhe JSON sono valide, qual è il messaggio di errore che si è verificato e da quale libreria? –

+0

La prima stringa viene serializzata da B'clone. ** Non ci sono errori durante questo. L'errore si verifica solo quando provo a serializzare POJO B. ** Messaggio di errore: _java.lang.UnsupportedOperationException: Tentativo di serializzare java.lang.Class: com.b5.customer.domain.Customer . Hai dimenticato di registrare un adattatore del tipo? _ –

risposta

10

Sembra che il tuo POJO è di tipo cliente? Quando cloni il tuo oggetto, stai creando un nuovo cliente, e Gson può serializzarlo perfettamente. Tuttavia, quando si recupera lo stesso oggetto dal DB, non si tratta di un oggetto cliente standard. Invece, è una sottoclasse che include alcune informazioni sulla persistenza, come la classe dell'oggetto.

Probabilmente la soluzione più semplice è utilizzare l'annotazione di G23 @Expose. Se si crea l'oggetto Gson con new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create(), è possibile contrassegnare ciascuno dei campi Cliente che si desidera serializzare con @Expose. Eventuali altri campi, compresi quelli della sottoclasse del framework di persistenza, non verranno serializzati.

+0

Ottima risposta! – Medo

2

Brandon aveva ragione. Ecco un'altra soluzione se non vuoi utilizzare alcuna annotazione o modificare la tua classe POJO. Questo può aiutare per qualsiasi altro ragazzo.

Type typeOfSrc = new TypeToken<A>() {}.getType(); //this helps for generic one. 
gson.toJson(obj, typeOfSrc); or gson.toJson(obj, A.class); 
Problemi correlati