根据 API 中的值在 POJO 中添加两个值,同时设置它 - Retrofit2 和 Gson 转换器
Add two more values in POJO based on a value from the API while setting it - Retrofit2 & Gson converter
首先,如果已经有答案,我深表歉意。但是我不确定要搜索什么。
现在我已经为我的 POJO 模型设置了 Retrofit2,一切正常。但某些节点的 API returns 日期的 unix 时间戳格式。我希望在设置 POJO 时将其转换并设置为两个值(星期几和人类可读日期)。
这是否可能,如何实现?
POJO 类似于:
public class Pojo {
@SerializedName("id")
@Expose
private int id;
@SerializedName("name")
@Expose
private String name;
@SerializedName("date")
@Expose
private int unixDate;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getUnixDate() {
return unixDate;
}
public void setUnixDate(int unixDate) {
// Tried the conversion and storing here but it of course won't work
this.unixDate = unixDate;
}
}
有没有办法指示 Retrofit2 或 Gson 转换器根据 unix 时间戳向 POJO 添加另外两个值(星期几和日期),但其他一切都保持默认状态。
编辑: 只是为了清理。我知道如何使用 ThreeTen Android Backport 并将 unix 转换为日期和日期。我只需要一种方法来指示 Gson 转换器或 Retrofit2 使用该逻辑。
干杯
在您的 POJO 中添加新字段。不要将它们注释为已暴露。
进行改造调用时,在 onResponse 方法中,为自定义字段赋值。像这样:
call.enqueue(new Callback<List<Pojo>>() {
public void onResponse(List<Pojo> list) {
for (Pojo pojo : list) {
pojo.setDayOfWeek();
pojo.setDate();
}
}
}
我解释了您在为 GSON 中的日期解析创建自定义逻辑时遇到的问题。
问题是这个方法不指示 GSON,它使用它自己的反序列化,所以它使用那个系统设置。
只需创建您自己的 class 并实现 JsonDeserializer 接口。
public class DiyDateParser implements JsonDeserializer<Date> {
@Override
public Date deserialize(JsonElement element, Type arg1, JsonDeserializationContext arg2) throws JsonParseException {
Date date = new Date((long)timeStamp*1000);
//Your implementation for date parsing
try {
return formatter.parse(date);
} catch (ParseException e) {
System.err.println("Failed to parse Date due to:", e);
return null;
}
}
}
之后就可以这样使用了:
GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(Date.class, new DiyDateParser());
首先,如果已经有答案,我深表歉意。但是我不确定要搜索什么。
现在我已经为我的 POJO 模型设置了 Retrofit2,一切正常。但某些节点的 API returns 日期的 unix 时间戳格式。我希望在设置 POJO 时将其转换并设置为两个值(星期几和人类可读日期)。
这是否可能,如何实现?
POJO 类似于:
public class Pojo {
@SerializedName("id")
@Expose
private int id;
@SerializedName("name")
@Expose
private String name;
@SerializedName("date")
@Expose
private int unixDate;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getUnixDate() {
return unixDate;
}
public void setUnixDate(int unixDate) {
// Tried the conversion and storing here but it of course won't work
this.unixDate = unixDate;
}
}
有没有办法指示 Retrofit2 或 Gson 转换器根据 unix 时间戳向 POJO 添加另外两个值(星期几和日期),但其他一切都保持默认状态。
编辑: 只是为了清理。我知道如何使用 ThreeTen Android Backport 并将 unix 转换为日期和日期。我只需要一种方法来指示 Gson 转换器或 Retrofit2 使用该逻辑。
干杯
在您的 POJO 中添加新字段。不要将它们注释为已暴露。 进行改造调用时,在 onResponse 方法中,为自定义字段赋值。像这样:
call.enqueue(new Callback<List<Pojo>>() {
public void onResponse(List<Pojo> list) {
for (Pojo pojo : list) {
pojo.setDayOfWeek();
pojo.setDate();
}
}
}
我解释了您在为 GSON 中的日期解析创建自定义逻辑时遇到的问题。 问题是这个方法不指示 GSON,它使用它自己的反序列化,所以它使用那个系统设置。 只需创建您自己的 class 并实现 JsonDeserializer 接口。
public class DiyDateParser implements JsonDeserializer<Date> {
@Override
public Date deserialize(JsonElement element, Type arg1, JsonDeserializationContext arg2) throws JsonParseException {
Date date = new Date((long)timeStamp*1000);
//Your implementation for date parsing
try {
return formatter.parse(date);
} catch (ParseException e) {
System.err.println("Failed to parse Date due to:", e);
return null;
}
}
}
之后就可以这样使用了:
GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(Date.class, new DiyDateParser());