2017-05-09 2 views
4

Ich habe ein Objekt in einem String gespeichert. Eines der Felder des Objekts ist ein LocalDate.Wie konvertiere ich einen JSON, der ein LocalDate-Feld enthält, in ein deserialisierbares Format?

"from": { 
     "year": 1000, 
     "month": "JANUARY", 
     "era": "CE", 
     "dayOfMonth": 1, 
     "dayOfWeek": "WEDNESDAY", 
     "dayOfYear": 1, 
     "leapYear": false, 
     "monthValue": 1, 
     "chronology": { 
      "calendarType": "iso8601", 
      "id": "ISO" 
     } 
    } 

Wie soll ich dieses json in ein Format konvertieren, das für die Deserialisierung verwendet werden kann?

Der folgende Code

import com.fasterxml.jackson.databind.ObjectMapper; 
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; 


ObjectMapper om = new ObjectMapper(); 
om.registerModule(new JavaTimeModule()); 
MyCustomObject obj = om.readValue(json, MyCustomObject.class); //error 

Ursachen dieser Ausnahme:

com.fasterxml.jackson.databind.JsonMappingException: Unexpected token (START_OBJECT), expected VALUE_STRING: Expected array or string. 

Hier ist die MyCustomObject Klasse, die ich als MyCustomObject verwenden <LOCALDATE>

public class MyCustomObject<T> { 
    private T from; 
    private T to; 

    public MyCustomObject() { 
    } 

    public T getFrom() { 
     return this.from; 
    } 

    public void setFrom(T from) { 
     this.from = from; 
    } 

    public T getTo() { 
     return this.to; 
    } 

    public void setTo(T to) { 
     this.to = to; 
    } 
} 
+1

Können Sie Ihren 'MyCustomObject' Code teilen? –

Antwort

0

Die LocalDate ist falsch im JSON gespeichert.

Der richtige Weg, um das Problem zu beheben, ist sicherzustellen, dass die ObjectMapper Generierung der JSON die JavaTimeModule oder die Jdk8Module registriert hat. Dies stellt sicher, dass die LocalDate korrekt zu einem JSON-Array von serialisiert ist.

Die Brute-Force-Methode folgt der Lösung, die @Roy in einer anderen Antwort beschrieben hat, und konvertiert jedes relevante Feld manuell in eine LocalDate. Etwas entlang der Linien von:

LocalDate date = LocalDate.now() 
     .with(ChronoField.YEAR, year) 
     .with(ChronoField.MONTH_OF_YEAR, Month.valueOf(month).getValue()) 
     .with(ChronoField.DAY_OF_MONTH, dayOfMonth); 

Das ist natürlich ziemlich fehleranfällig, und nicht, wie die Klassen wurden sollen verwendet werden.

1

Ihre MyCustomObject.class ersetzen wie dies:

================================== 
package ; 
public class Chronology 
{ 
    private String calendarType; 

    private String id; 

    public void setCalendarType(String calendarType){ 
     this.calendarType = calendarType; 
    } 
    public String getCalendarType(){ 
     return this.calendarType; 
    } 
    public void setId(String id){ 
     this.id = id; 
    } 
    public String getId(){ 
     return this.id; 
    } 
} 

================================== 
package ; 
public class From 
{ 
    private int year; 

    private String month; 

    private String era; 

    private int dayOfMonth; 

    private String dayOfWeek; 

    private int dayOfYear; 

    private boolean leapYear; 

    private int monthValue; 

    private Chronology chronology; 

    public void setYear(int year){ 
     this.year = year; 
    } 
    public int getYear(){ 
     return this.year; 
    } 
    public void setMonth(String month){ 
     this.month = month; 
    } 
    public String getMonth(){ 
     return this.month; 
    } 
    public void setEra(String era){ 
     this.era = era; 
    } 
    public String getEra(){ 
     return this.era; 
    } 
    public void setDayOfMonth(int dayOfMonth){ 
     this.dayOfMonth = dayOfMonth; 
    } 
    public int getDayOfMonth(){ 
     return this.dayOfMonth; 
    } 
    public void setDayOfWeek(String dayOfWeek){ 
     this.dayOfWeek = dayOfWeek; 
    } 
    public String getDayOfWeek(){ 
     return this.dayOfWeek; 
    } 
    public void setDayOfYear(int dayOfYear){ 
     this.dayOfYear = dayOfYear; 
    } 
    public int getDayOfYear(){ 
     return this.dayOfYear; 
    } 
    public void setLeapYear(boolean leapYear){ 
     this.leapYear = leapYear; 
    } 
    public boolean getLeapYear(){ 
     return this.leapYear; 
    } 
    public void setMonthValue(int monthValue){ 
     this.monthValue = monthValue; 
    } 
    public int getMonthValue(){ 
     return this.monthValue; 
    } 
    public void setChronology(Chronology chronology){ 
     this.chronology = chronology; 
    } 
    public Chronology getChronology(){ 
     return this.chronology; 
    } 
} 

================================== 
package ; 
public class MyCustomObject 
{ 
    private From from; 

    public void setFrom(From from){ 
     this.from = from; 
    } 
    public From getFrom(){ 
     return this.from; 
    } 
} 
Verwandte Themen