我正在尝试在 Retrofit 中反序列化此类:
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 的 LocalDateTime。嗯,我从我的服务器收到这个
{
"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 所以我相信 Retrofit 不知道如何解析数据,或者我错过了什么?
有什么好的解决方法吗?
感谢任何帮助!
最佳答案
先添加这个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;
}
}
}
然后您可以将 retrofit 的响应分配给此类的对象,并使用 setter 检索值。
关于android - 如何在 Retrofit 中反序列化 ThreeTen LocalDateTime?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40456566/