Значение 1476399300000
выглядит как ms из начала эпохи Unix. Просто добавьте адаптер типа в свой Gson:
final class UnixEpochDateTypeAdapter
extends TypeAdapter<Date> {
private static final TypeAdapter<Date> unixEpochDateTypeAdapter = new UnixEpochDateTypeAdapter();
private UnixEpochDateTypeAdapter() {
}
static TypeAdapter<Date> getUnixEpochDateTypeAdapter() {
return unixEpochDateTypeAdapter;
}
@Override
public Date read(final JsonReader in)
throws IOException {
// this is where the conversion is performed
return new Date(in.nextLong());
}
@Override
@SuppressWarnings("resource")
public void write(final JsonWriter out, final Date value)
throws IOException {
// write back if necessary or throw UnsupportedOperationException
out.value(value.getTime());
}
}
Настройте свой экземпляр Gson:
final Gson gson = new GsonBuilder()
.registerTypeAdapter(Date.class, getUnixEpochDateTypeAdapter())
.create();
Экземпляры Gson
потокобезопасны, как и UnixEpochDateTypeAdapter
, и могут существовать как один экземпляр глобально. Пример:
final class Mapping {
final Date date = null;
}
final String json = "{\"date\":1476399300000}";
final Mapping mapping = gson.fromJson(json, Mapping.class);
System.out.println(mapping.date);
System.out.println(gson.toJson(mapping));
даст следующий результат:
Пт, 14 октября, 01:55:00 EEST 2016
{"date":1476399300000}
Обратите внимание, что адаптер типа настроен на переопределение адаптера типа даты Gson по умолчанию. Поэтому вам может потребоваться более сложный анализ, чтобы определить, является ли это просто ms эпохи Unix. Также обратите внимание, что вы можете использовать JsonDeserializer
, но последний работает в виде дерева JSON, в то время как адаптеры типов работают в потоковом режиме, что несколько более эффективно, вероятно, без накопления промежуточных результатов.
Редактировать:
Кроме того, это может показаться запутанным, но Gson может преобразовывать значения для примитивов. Несмотря на то, что ваша полезная нагрузка имеет строковое значение, JsonReader.nextLong()
может читать строковый примитив как длинное значение. Таким образом, UnixEpochDateTypeAdapter.write
должно быть out.value(String.valueOf(value.getTime()));
, чтобы не изменять литералы JSON.
Редактировать
Существует также более короткое решение (работа с деревьями JSON в памяти, а не с потоковой передачей данных), которое просто:
final Gson builder = new GsonBuilder()
.registerTypeAdapter(Date.class, new JsonDeserializer<Date>() {
public Date deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext context) throws JsonParseException {
return new Date(jsonElement.getAsJsonPrimitive().getAsLong());
}
})
.create();
person
Lyubomyr Shaydariv
schedule
31.01.2017