2013-08-25 14 views
7

Sto provando a controllare il formato di serializzazione usando l'annotazione. Ma non sembra esserci alcun modo per accedere all'annotazione dei campi da TypeAdapter o TypeAdapterFactory.Formattazione serializzazione controllo GSON con annotazione

Ecco un esempio di ciò che sto cercando di ottenere.

import org.joda.time.DateTime; 

public class Movie { 
    String title; 

    @DateTimeFormat("E, M d yyyy") 
    DateTime releaseDate; 
    // other fields ... 
} 

public class LogEvent { 
    String message; 

    @DateTimeFormat("yyyyMMdd'T'HHmmss.SSSZ") 
    DateTime timestamp; 
} 

per oggetto di film, voglio serializzare la data come "Sabato 24 agosto 2013", ma per LogEvent, "20130824T103025.123Z".

che sto cercando di fare questo senza dover scrivere separata TypeAdapterFactory di per ogni classe (Immaginate se abbiamo 100 classe diversa con campi DateTime in loro che richiedono diversi formati)

TIA!

risposta

1

Ecco un modo. L'idea è di usare un TypeAdapterFactory per caricare le tue classi. Quindi, dopo aver caricato un oggetto, individuare il campo di tipo DateTime per applicare l'annotazione e sostituire il valore.

In non so come verrà salvato l'oggetto DateTime, quindi forse sarà necessario utilizzare uno getAsJsonObject anziché getAsJsonPrimitive.

final class MyAdapter implements TypeAdapterFactory { 
    @Override 
    public <T> TypeAdapter<T> create(final Gson gson, final TypeToken<T> tokenType) { 
    final TypeAdapter<T> adapter = gson.getDelegateAdapter(this, tokenType); 

    return new TypeAdapter<T>() { 
     @Override 
     public T read(JsonReader reader) throws IOException { 
     JsonElement tree = gson.getAdapter(JsonElement.class).read(reader); 
     T out = adapter.fromJsonTree(tree); 

     // important stuff here 
     Class<? super T> cls = tokenType.getRawType(); 
     for (Field field : cls.getDeclaredFields()) { 
      if (DateTime.class.isAssignableFrom(field.getType())) { 
      DateTimeFormat ano = field.getAnnotation(DateTimeFormat.class); 
      if (ano != null) { 
       JsonPrimitive val = ((JsonObject) tree).getAsJsonPrimitive(field.getName()); 
       String format = ano.value(); 

       DateTime date = // .. do your format here 
       field.set(out, date); 
      } 
      } 
     } 

     return out; 
     } 

     @Override 
     public void write(JsonWriter writer, T value) throws IOException { 
     } 
    }; 
    } 
} 
+0

In questa domanda, quello che sto cercando di evitare è dover creare un adattatore personalizzato per ogni classe che contiene il campo DateTime solo perché voglio formattare il campo in modo diverso in ogni classe. Ma forse questo non è possibile senza reimplementare ReflectiveTypeAdapterFactory. – hendysg

+0

È un 'TypeAdapterFactory', non un adattatore specifico, quindi dovrebbe funzionare per ogni classe. Prova. – PomPom

Problemi correlati