Retrofit日期转换器

3
我有一个返回对象列表的WCF服务,用于向Android应用程序返回数据。其中一个属性是DateTime属性。返回格式为JSON,我在Android端得到的日期格式为/Date(1441117247253+0200)/。我使用com.squareup.retrofit:retrofit:1.9.0从我的服务中获取数据。
我不知道如何使用Retrofit将字符串日期转换为Date对象。我查看了这个http://square.github.io/retrofit/下的Custom Converters部分,但不知道如何继续。这是我尝试过的,但我不知道如何实现转换器类。
创建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”。 - Leo Nix
是的,我考虑过这个问题,但那样我就得修改我的服务来适应一个客户类型。客户应该真正适应服务,你知道我的意思吧。 - pjdupreez
在服务上创建两个对象,一个返回DateTime,另一个返回客户端特定的DateTime dateTimeProperty.ToString("client-supported-format")。否则,你会写一个低级的JavaScript DateTime转换器来支持服务吗?既然你已经掌控了它,我不会这样做。 - DJ'
1个回答

3

好的,经过一番调查,我找到了这个。我的方法是错误的。所以最终我创建了一个类似于以下的转换器:

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)/。也许其他人也会发现这个有用...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接