2016-10-24 3 views
0

Ich habe ein JSON-Objekt, das primitive Felder wie int und string sowie Datum field und time-Feld (auch als String) enthält. Examle meiner JSON:Implementierung benutzerdefinierter Deserializer in Gson mit einigen Funktionen des Standard-Deserializers

{ 
     "auditorium":"506", 
     "beginLesson":"10:30", 
     "date":"2016.09.12", 
     "dayOfWeekString":"Monday", 
     "discipline":"Math", 
     "endLesson":"11:10", 
     "kindOfWork":"Lesson", 
     "lecturer":"John Smith" 
     } 

I Gson lib verwenden, und ich bin die Umsetzung kundenspezifische Deserializer, weil ich will "beginLesson" und "endLesson" Felder bekommen nicht als String, sondern als Localtime (Ich verwende JodaTime lib). Also erhalte ich diese Felder und wandle sie in LocalTime um, aber ich möchte, dass andere Felder wie normal deserialisiert werden (wenn ich einfach von der Methode json() schreibe, wird jedes Feld in meiner Klasse in json auf denselben Wert gesetzt). Gibt es eine einfache Möglichkeit, diese Felder automatisch zu deserialisieren? Oder der einzige Weg, ich habe - ist viele Zeilen wie

MyClass.auditorium = json.get("auditorium"); MyClass.kindOfWork = json.get("kindOfWork");

+1

Versuchen Sie hier prüfen. http://stackoverflow.com/questions/9296427/gson-deserialization-trying-to-parse-a-json-to-an-object Ich bin nicht vertraut mit Gson, Jackson ist meine JSON-Bibliothek der Wahl. Aber ich bin sicher, dass es eine Art von Deserialisierung direkt zu einer Klasse gibt, indem Sie das Klassenobjekt übergeben. Jackson verwendet Anmerkungen, um Felder für die Serialisierung zu markieren. Also im Wesentlichen sagen Sie etwas wie @JsonProperty ("beginLesson") private LocalTime beginLessonLocalTime_; –

Antwort

1

Die LocalTime Deserialisierung behandelt werden können, schreiben benutzerdefinierte TypeAdapter verwenden. Bitte beziehen Sie sich auf LocalTimeDeserializer Klasse.

1) Datumsformat wird als "YYYY.MM.DD"

2) org.joda.time.LocalTime - Formatter "HH: mm"

Hauptmethode: -

public static void main(String[] args) { 
     String jsonString = "{\"auditorium\":\"506\",\"beginLesson\":\"10:30\",\"date\":\"2016.09.12\",\"dayOfWeekString\":\"Monday\",\"discipline\":\"Math\",\"endLesson\":\"11:10\",\"kindOfWork\":\"Lesson\",\"lecturer\":\"John Smith\"}"; 
     Gson gson = new GsonBuilder().setDateFormat("yyyy.MM.dd") 
       .registerTypeAdapter(LocalTime.class, new LocalTimeDeserializer()).create(); 

     Auditorium auditorium = gson.fromJson(jsonString, Auditorium.class); 
     System.out.println(auditorium.toString()); 

    } 

Auditorium Klasse: -

public class Auditorium implements Serializable{ 

    private static final long serialVersionUID = 6752903482239784124L; 

    private final DateTimeFormatter fmt = DateTimeFormat.forPattern("HH:mm"); 

    private String auditorium; 
    private LocalTime beginLesson; 
    private Date date; 
    private String dayOfWeekString; 
    private String discipline; 
    private LocalTime endLesson; 
    private String kindOfWork; 
    private String lecturer; 
    @Override 
    public String toString() { 
     return "Auditorium [auditorium=" + auditorium + ", beginLesson=" + beginLesson.toString(fmt) + ", date=" + date 
       + ", dayOfWeekString=" + dayOfWeekString + ", discipline=" + discipline + ", endLesson=" + endLesson.toString(fmt) 
       + ", kindOfWork=" + kindOfWork + ", lecturer=" + lecturer + "]"; 
    } 

    ... getter and setters 

} 

Localtime Deserializer: -

public class LocalTimeDeserializer implements JsonDeserializer<LocalTime> { 

    final DateTimeFormatter fmt = DateTimeFormat.forPattern("HH:mm"); 

    @Override 
    public LocalTime deserialize(JsonElement paramJsonElement, Type paramType, 
      JsonDeserializationContext paramJsonDeserializationContext) throws JsonParseException { 

     return LocalTime.parse(paramJsonElement.getAsString(), fmt); 
    } 

} 

Ausgang: -

Auditorium [auditorium=506, beginLesson=10:30, date=Mon Sep 12 00:00:00 BST 2016, dayOfWeekString=Monday, discipline=Math, endLesson=11:10, kindOfWork=Lesson, lecturer=John Smith] 
+0

Vielen Dank, noch eine Frage - warum haben Sie Serializable in Auditorium implementiert? Das ist etwas, was ich auch tun sollte, oder es ist einfach nur ein praktischer Code-Stil für dich? – Leopik

+1

Siehe http://stackoverflow.com/questions/4548816/when-should-we-implement-serializable-interface. Wenn Ihr Anwendungsfall es nicht benötigt, können Sie das Serializable entfernen. – notionquest

Verwandte Themen