使用Date属性

时间:2016-04-22 10:22:24

标签: android gson retrofit

JSON结构如下所示:

"blabla": 1234,
"blabla2": "1234",
"object": {
        "property1": "1234",
        "property2": "blablab",
        "property3": "12345",
        "property4": Date object,
    }
}

由于这种结构,我实现了一个自定义反序列化器并在TypeAdapter中传递它:

.registerTypeAdapter(Date.class, new DateDeserializer())
                .registerTypeAdapter(GenericNotificationResponse.class, new NotificationDeserializer())
                .setDateFormat("yyyy-MM-dd'T'HH:mm:ss")
                .create();

public class NotificationDeserializer implements JsonDeserializer<GenericNotificationResponse> {
    @Override
    public GenericNotificationResponse deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
        JsonObject content = json.getAsJsonObject();
        GenericNotificationResponse message = new Gson().fromJson(json, typeOfT);
        JsonElement notification = content.get("notification");
        if (message.mType == 1)
            message.mNotification = (new Gson().fromJson(notification, Model1.class));
        else if (message.mType == 2)
            message.mNotification = (new Gson().fromJson(notification, Model2.class));
        return message;
    }
}

内部对象的反序列化很好。直到最近,当我更改模型并开始接收Date对象时,如JSON结构中所示,最后一个属性。由于某种原因,它无法解析它并且它会抛出错误,所以我似乎没有调用我在TypeAdapter中传递的DateDeserializer,因为这些行:

 message.mNotification = (new Gson().fromJson(notification, Model1.class));

message.mNotification = (new Gson().fromJson(notification, Model2.class));

DateDeserializer可以工作,因为我在其他模型中使用它并且它可以解决问题。有什么办法可以在内部json对象中对date属性进行反序列化吗?谢谢!

1 个答案:

答案 0 :(得分:1)

执行此操作时:

 message.mNotification = (new Gson().fromJson(notification, Model1.class));

您正在使用没有Gson()的新DateDeserializer实例进行反序列化。

尝试这样的事情:

new GsonBuilder().registerTypeAdapter(Date.class, new DateDeserializer())            
                .setDateFormat("yyyy-MM-dd'T'HH:mm:ss")
                .create().fromJson(notification, Model1.class));

显然,Model2也是如此。