根据 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());