2017-05-09 62 views
4

我有一個存儲在一個字符串中的對象。對象的其中一個字段是LocalDate。如何將包含LocalDate字段的json轉換爲可反序列化的格式?

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

我應該如何將此json轉換爲可用於反序列化的格式?

下面的代碼

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 

導致此異常:

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

這裏是我作爲MyCustomObject <使用LOCALDATE的>

​​
+1

你可以分享你的MyCustomObject代碼嗎? –

回答

0

LocalDate被錯誤地存儲在JSON中。

解決該問題的正確方法是確保生成JSON的ObjectMapper已登記JavaTimeModuleJdk8Module。這確保LocalDate被正確序列化爲[year, month, day]的JSON數組。

蠻力方法是遵循@Roy在另一個答案中概述的解決方案,並將每個相關字段手動轉換爲LocalDate。沿線的東西:

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

這顯然是相當容易出錯,而不是打算如何使用類。

1

更換你MyCustomObject.class像MyCustomObject類這個:

================================== 
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; 
    } 
} 
相關問題