改造日期转换器

时间:2015-09-02 20:33:20

标签: android wcf retrofit

我有一个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)/因为字符串不能转换为日期。

非常感谢任何协助。

1 个答案:

答案 0 :(得分:3)

好的,经过一番挖掘后,我遇到了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)/与时区一起出现。也许其他人可能会找到一些用途......