2016-11-07 3 views
1

나는 개조에이 클래스를 deserialise려고 : 당신이 볼 수 있듯이, 내가 LocalDateTime을 사용하고개조에서 ThreeTen LocalDateTime을 역 직렬화하는 방법?

data class Measurement(val id: Long, val value: Float, val dateTime: LocalDateTime, val trashCanId: Long) : Parcelable { 
    companion object { 
     @JvmField val CREATOR: Parcelable.Creator<Measurement> = object : Parcelable.Creator<Measurement> { 
      override fun createFromParcel(source: Parcel): Measurement = Measurement(source) 
      override fun newArray(size: Int): Array<Measurement?> = arrayOfNulls(size) 
     } 
    } 

    constructor(source: Parcel) : this(source.readLong(), source.readFloat(), source.readSerializable() as LocalDateTime, source.readLong()) 

    override fun describeContents() = 0 

    override fun writeToParcel(dest: Parcel?, flags: Int) { 
     dest?.writeLong(id) 
     dest?.writeFloat(value) 
     dest?.writeSerializable(dateTime) 
     dest?.writeLong(trashCanId) 
    } 

} 

, 그것은 ThreeTen에서입니다. 글쎄, 난 내 서버

{ 
     "id": 1, 
     "value": 50.6, 
     "dateTime": { 
      "hour": 2, 
      "minute": 6, 
      "second": 9, 
      "nano": 0, 
      "dayOfYear": 308, 
      "dayOfWeek": "THURSDAY", 
      "month": "NOVEMBER", 
      "dayOfMonth": 3, 
      "year": 2016, 
      "monthValue": 11, 
      "chronology": { 
      "id": "ISO", 
      "calendarType": "iso8601" 
      } 
     } 
     } 

음에서이를받을 수 있지만 내 날짜 시간 항상 이다 나는 데이터 구문 분석하는 방법을 개조 알고 나던 있다고 생각, 또는 내가 뭔가를 놓친 게 뭐죠?

좋은 해결 방법이 있습니까?

도움을 주시면 감사하겠습니다.

답변

0

은 ... 먼저 나는 DateTimeDto를 만들었습니다.

data class DateTimeDto(val dayOfYear : Int, val dayOfWeek : String, val month : String, val dayOfMonth : Int, 
         val year : Int, val monthValue : Int, val hour : Int, val minute : Int, val second : Int, 
         val nano : Int, val chronology : Chronology) 



fun toDateTime() : LocalDateTime{ 
    return LocalDateTime.of(year, monthValue, dayOfMonth, hour, minute) 
} 

내가에서 인터페이스의 서명을 변경 :

@GET("trashCan") 

fun getLocalDateTime() : Observable<List<LocalDateTime>> 

사람 :

@GET("trashCan") 

fun getLocalDateTime() : Observable<List<DateTimeDto>> 

그런 다음 내 관찰자에 내가했던 그 :

ServiceGenerator.createService(ApiClient::class.java) 
       .getLocalDateTime 
       .map { it.map { it.toLocalDateTime() } } 

그리고 괜찮 았는데 ... 괜찮 으면 좋겠어. I Retrofit이 자동으로 역 직렬화 할 수 있지만 이는 좋은 해결 방법입니다.

1

에 추가하기이 Gradle을

public class DemoResponse { 
@com.google.gson.annotations.SerializedName("id") 
public int id; 
@com.google.gson.annotations.SerializedName("value") 
public double value; 

public int getId() { 
    return id; 
} 

public void setId(int id) { 
    this.id = id; 
} 

public double getValue() { 
    return value; 
} 

public void setValue(double value) { 
    this.value = value; 
} 

public Datetime getDatetime() { 
    return datetime; 
} 

public void setDatetime(Datetime datetime) { 
    this.datetime = datetime; 
} 

@com.google.gson.annotations.SerializedName("dateTime") 
public Datetime datetime; 

public static class Chronology { 
    @com.google.gson.annotations.SerializedName("id") 
    public String id; 
    @com.google.gson.annotations.SerializedName("calendarType") 
    public String calendartype; 

    public String getId() { 
     return id; 
    } 

    public void setId(String id) { 
     this.id = id; 
    } 

    public String getCalendartype() { 
     return calendartype; 
    } 

    public void setCalendartype(String calendartype) { 
     this.calendartype = calendartype; 
    } 
} 

public static class Datetime { 
    @com.google.gson.annotations.SerializedName("hour") 
    public int hour; 
    @com.google.gson.annotations.SerializedName("minute") 
    public int minute; 
    @com.google.gson.annotations.SerializedName("second") 
    public int second; 
    @com.google.gson.annotations.SerializedName("nano") 
    public int nano; 
    @com.google.gson.annotations.SerializedName("dayOfYear") 
    public int dayofyear; 
    @com.google.gson.annotations.SerializedName("dayOfWeek") 
    public String dayofweek; 
    @com.google.gson.annotations.SerializedName("month") 
    public String month; 
    @com.google.gson.annotations.SerializedName("dayOfMonth") 
    public int dayofmonth; 
    @com.google.gson.annotations.SerializedName("year") 
    public int year; 
    @com.google.gson.annotations.SerializedName("monthValue") 
    public int monthvalue; 
    @com.google.gson.annotations.SerializedName("chronology") 
    public Chronology chronology; 

    public int getHour() { 
     return hour; 
    } 

    public void setHour(int hour) { 
     this.hour = hour; 
    } 

    public int getMinute() { 
     return minute; 
    } 

    public void setMinute(int minute) { 
     this.minute = minute; 
    } 

    public int getSecond() { 
     return second; 
    } 

    public void setSecond(int second) { 
     this.second = second; 
    } 

    public int getNano() { 
     return nano; 
    } 

    public void setNano(int nano) { 
     this.nano = nano; 
    } 

    public int getDayofyear() { 
     return dayofyear; 
    } 

    public void setDayofyear(int dayofyear) { 
     this.dayofyear = dayofyear; 
    } 

    public String getDayofweek() { 
     return dayofweek; 
    } 

    public void setDayofweek(String dayofweek) { 
     this.dayofweek = dayofweek; 
    } 

    public String getMonth() { 
     return month; 
    } 

    public void setMonth(String month) { 
     this.month = month; 
    } 

    public int getDayofmonth() { 
     return dayofmonth; 
    } 

    public void setDayofmonth(int dayofmonth) { 
     this.dayofmonth = dayofmonth; 
    } 

    public int getYear() { 
     return year; 
    } 

    public void setYear(int year) { 
     this.year = year; 
    } 

    public int getMonthvalue() { 
     return monthvalue; 
    } 

    public void setMonthvalue(int monthvalue) { 
     this.monthvalue = monthvalue; 
    } 

    public Chronology getChronology() { 
     return chronology; 
    } 

    public void setChronology(Chronology chronology) { 
     this.chronology = chronology; 
    } 
    } 
    } 

그런 다음이 클래스의 객체에 대한 개조의 응답을 지정하고, 검색 할 수 있습니다,

compile 'com.google.code.gson:gson:2.8.0' 

그런 다음 JSON 응답을 유지하기 위해이 클래스를 추가 첫번째 세터를 사용하여 값.

Bsed은 마노 Frekzz의 대답에, 내 해결책을 발견

+1

감사합니다. Manoj, 몇 시간 후에 코드를 사용해 보겠습니다. –