2016-12-27 5 views
4

Я использую Gson для сериализации/десериализации моих pojos и в настоящее время ищут чистый способ рассказать Gson о синтаксическом анализе/выводе атрибутов даты как unix-timestamps. Вот моя попытка:Gson dateformat для разбора/вывода unix-timestamps

Gson gson = new GsonBuilder().setDateFormat("U").create(); 

Comming от PHP, где "U" является DateFormat используется для анализа даты/вывода в UNIX-метки времени, при запуске моей попытке кода, я получаю эту RuntimeException:

Неизвестный шаблон символ «U»

Я предполагаю, что Gson использует SimpleDateFormat под капотом, который не определяет букву «U».

Я могу написать DateTypeAdapter и зарегистрировать его в GsonBuilder, но я ищу более чистый способ достижения этого. Простое изменение DateFormat было бы замечательно.

ответ

7

Создание таможни DateTypeAdapter было возможным.

MyDateTypeAdapter

public class MyDateTypeAdapter extends TypeAdapter<Date> { 
    @Override 
    public void write(JsonWriter out, Date value) throws IOException { 
     if (value == null) 
      out.nullValue(); 
     else 
      out.value(value.getTime()/1000); 
    } 

    @Override 
    public Date read(JsonReader in) throws IOException { 
     if (in != null) 
      return new Date(in.nextLong() * 1000); 
     else 
      return null; 
    } 
} 

Не забудьте зарегистрировать его

Gson gson = new GsonBuilder().registerTypeAdapter(Date.class,new MyDateTypeAdapter()).create(); 
+1

Привет, ваш ответ разрешает ваш вопрос на https://github.com/google/gson/issues/987, так как у ypu есть собственное решение, которое реализовано по-настоящему Gson (не обходным путем, это по дизайну). :) Не могли бы вы закрыть вопрос? Благодаря! –

+0

@LyubomyrShaydariv Thanx для напоминания мне. Ваш запрос выполнен. (И вы правы, сэр, именно так разработан Gson) – AnixPasBesoin

+1

Ах, и еще одно примечание: 'JsonReader.toString' возвращает человекочитаемое текущее состояние' JsonReader', например 'JsonReader 'в строке 1 column 1 path $'. Вероятно, есть опечатка, а 'in.nextString()' действительно делает то, что вам нужно в вашем коде. Или еще короче: 'new Date (in.nextLong()/1000)'. –

0

Марки времени всего long, так что вы можете использовать их в своем POJO. Или используйте Long, чтобы получить null, если поле отсутствует.

class myPOJO { 
    Long myDate; 
} 
+0

Не есть ли другой способ, чтобы сохранить свои атрибуты даты как даты? Это похоже на хакерское решение проблемы, с которой я имею дело. – AnixPasBesoin