【问题标题】:Retrofit Date Converter改造日期转换器
【发布时间】:2015-09-02 20:33:19
【问题描述】:

我有一个 WCF 服务,它向 Android 应用程序返回一个对象列表。其中一个属性是 DateTime 属性。返回格式是 JSON,我在 Android 端以这种格式 /Date(1441117247253+0200)/ 获取日期。我正在使用 com.squareup.retrofit:retrofit:1.9.0 从我的服务中获取数据。

我不知道如何使用 Retrofit 将字符串日期创建到 Date 对象中。我在“自定义转换器”部分下查看了这个http://square.github.io/retrofit/,但不知道如何更进一步。这是我尝试过的,但我不知道如何实现转换器类。

像这样创建 restAdapter:

restAdapter = new RestAdapter.Builder()
                .setConverter(new DotNetDateConverter())
                .setLogLevel(RestAdapter.LogLevel.FULL)
                .setEndpoint(API).build();

还有我不知道如何进一步实现的 DotNetDateConverter 类:

public class DotNetDateConverter implements Converter
{
    @Override
    public Object fromBody(TypedInput body, Type type) throws ConversionException
    {
        return null;
    }

    @Override
    public TypedOutput toBody(Object object)
    {
        return null;
    }
}

响应中有其他字段很好,但是如何将/Date(1441117247253+0200)/ 更改为正确的 java.util.Date 对象?如果没有转换器,我得到com.google.gson.JsonSyntaxException:/Date(1441117247253+0200)/ 显然是因为字符串不能转换为日期。

任何帮助将不胜感激。

【问题讨论】:

  • 一种选择是在 WCF 端将属性数据类型从 DateTime 更改为 String 类型并将值转换为字符串(即:转换为短日期使用 dateTimeProperty.ToString("d")) .并且您的服务操作响应应具有正确的 JSON 数据格式,例如“9/2/2015”。
  • 是的,我考虑过这一点,但随后我将更改我的服务以适应一种客户类型。如果您明白我的意思,客户应该真正适应服务。
  • 在服务上创建两个对象,一个返回 DateTime,另一个返回客户端特定的 DateTime dateTimeProperty.ToString("client-supported-format")。否则,当您已经可以控制该服务时,您是否要在 javascript 中编写一个低级别的 DateTime 转换器来支持该服务?我不会那样做的。

标签: android wcf retrofit


【解决方案1】:

好的,经过一番挖掘,我遇到了this。我的方法是错误的。所以我最终创建了一个这样的转换器:

public class DotNetDateConverter implements JsonDeserializer<Date>
{
    @Override
    public Date deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException
    {
        String s = json.getAsJsonPrimitive().getAsString();
        long l = Long.parseLong(s.substring(s.indexOf("(")+1, s.indexOf("+")));
        Date d = new Date(l);
        return d;
    }
}

我也必须像这样注册它:

GsonBuilder gsonBuilder = new GsonBuilder();
        gsonBuilder.registerTypeAdapter(Date.class, new DotNetDateConverter());

        restAdapter = new RestAdapter.Builder()
                .setConverter(new GsonConverter(gsonBuilder.create()))
                .setLogLevel(RestAdapter.LogLevel.FULL)
                .setEndpoint(API).build();

我不得不稍微更改代码以适应我的特定情况,即日期以/Date(1441117247253+0200)/ 的形式出现,并带有时区。也许其他人可能会对此有所帮助...

【讨论】:

    猜你喜欢
    • 2020-03-25
    • 2023-03-14
    • 1970-01-01
    • 2013-02-09
    • 2013-10-20
    • 2014-09-22
    • 2012-04-11
    • 2012-02-20
    • 2015-12-11
    相关资源
    最近更新 更多