2017-05-09 1 views
4

개체가 String에 저장되어 있습니다. 객체의 필드 중 하나가 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.class를 교체 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

'MyCustomObject' 코드를 공유 할 수 있습니까? –

답변

0

LocalDate은 JSON에 잘못 저장되어 있습니다.

문제를 해결하는 올바른 방법은 ObjectMapper에 JSON을 생성하려면 JavaTimeModule 또는 Jdk8Module이 등록되어 있는지 확인하는 것입니다. 이렇게하면 LocalDate이 정확하게 [year, month, day]의 JSON 배열로 직렬화됩니다.

brute-force 방법은 @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 <로 사용하는 MyCustomObject 클래스의 this :

================================== 
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; 
    } 
} 
관련 문제