2016-11-07 2 views
1

Я пытаюсь deserialise этого класса в Модернизированном:Как десериализовать 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) 
    } 

} 

Как вы можете видеть, я использую LocalDateTime, это от 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" 
      } 
     } 
     } 

Ну, а мой DATETIME всегда Null поэтому я считаю, что дооснащения не знает, как разбора данных, или я что-то отсутствует?

Есть ли какое-нибудь хорошее обходное решение?

Любая помощь приветствуется!

ответ

0

СКДЭС на Манодж Frekzz ответ, я нашел решение ...

Сначала я создал 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>> 

To:

@GET("trashCan") 

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

Тогда в моем Observer я сделал это:

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

И он работал отлично ... Было бы лучше, если бы I Retrofit может десериализовать его автоматически, но это хороший способ обхода

1

Добавить это Gradle первого

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

Затем добавить этот класс, чтобы держать ответ JSon,

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; 
    } 
    } 
    } 

Затем вы можете назначить ответ от модификации на объект этого класса, и получить значения с использованием сеттеров.

+1

Спасибо Manoj, я попробую вас код за несколько часов –

Смежные вопросы