There (still) exists a bug in urbanairship-java SDK related to parsing valid ISO8601 dates. The original bug report can be found here: GSon date parsing error.
The Cause
ISO8601 states that for date-time strings the separator “T” can be left out. Unfortunately the urbanairship-java SDK expects only fully qualified ISO8601 strings. Thus, when it receives a (perfectly valid) date-time string such as the one shown below it throws a JsonParseException:
{
"device_token": "XXX",
"last_registration": "2012-12-27 08:24:33",
"tz": null,
"tags": [],
"alias": null,
"quiettime": {
"start": null,
"end": null
},
"active": true,
"badge": 0
}
The stacktrace caused by the JsonParseException thrown looks similiar like the one shown below:
com.google.gson.JsonParseException: 2012-12-27 08:24:33 at com.urbanairship.GsonFactory$CalendarAdapter.deserialize(GsonFactory.java:54) at com.urbanairship.GsonFactory$CalendarAdapter.deserialize(GsonFactory.java:1) at com.google.gson.TreeTypeAdapter.read(TreeTypeAdapter.java:58) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:93) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:172) at com.google.gson.Gson.fromJson(Gson.java:795) at com.google.gson.Gson.fromJson(Gson.java:761) at com.google.gson.Gson.fromJson(Gson.java:710) at com.google.gson.Gson.fromJson(Gson.java:682) at com.urbanairship.UrbanAirshipClient.fromJson(UrbanAirshipClient.java:527) at com.urbanairship.UrbanAirshipClient.fromJson(UrbanAirshipClient.java:385) at com.urbanairship.UrbanAirshipClient.get(UrbanAirshipClient.java:507) at com.urbanairship.UrbanAirshipClient.getDevice(UrbanAirshipClient.java:250) ... many more
The problem is caused in the fromJSON function in Urbanairshipclient.java:
protected <T> T fromJson(final String json, final Class<T> clazz) {
Gson gson = GsonFactory.create();
return gson.fromJson(json, clazz); // PROBLEM HERE
}
The Fix
Luckily the fix is pretty easy. Open ISO8601.java and update the PATTERN variable as follows:
public class ISO8601
{
//public static final String PATTERN = "yyyy-MM-dd'T'HH:mm:ssZ"; //BUG HERE
public static final String PATTERN = "yyyy-MM-dd HH:mm:ss"; //BUG FIXED
...
}
That’s it. I’ve updated the bug report accordingly.
Leave a Reply