Сериализация и десериализация LocalDateTime в JSON в формате RF C 3339 в java с помощью Gson - PullRequest
1 голос
/ 28 января 2020

В настоящее время я пытаюсь сохранить некоторые объекты базы данных, которые содержат метки времени, в графической базе данных (dgraph). Я хотел бы использовать JSON, чтобы легко взять информацию о дате и времени и сохранить ее в узле даты и времени на графике, но график будет принимать только данные, отформатированные в формате RF C 3339 с необязательный часовой пояс (например, 2006-01-02T15:04:05.999999999).

Я использую Gson для сериализации и десериализации, и другие типы данных работают нормально, но при попытке запросить даты возвращает null. Я пытался использовать setDateFormat, но это ничего не меняет. В настоящее время у меня есть временные метки, хранящиеся в классе LocalDateTime, но я могу изменить их при необходимости.

Как я могу заставить Gson использовать правильный формат с моими временными метками? В настоящее время он помещает их в этот формат

"start":{
  "date":{"year":2011,"month":1,"day":2},
  "time":{"hour":10,"minute":4,"second":0,"nano":0}
}

Я новичок в сериализации и JSON в целом, поэтому любые указатели будут оценены.

Я понял, что gson, кажется, разделив мою временную метку на два отдельных блока данных, как я могу заставить их хранить их вместе в правильном формате? Нужен ли мне адаптер типа? (Я не знаю, как они работают)

1 Ответ

1 голос
/ 29 января 2020

Если вы хорошо используете библиотеку, Joda Time предлагает простое решение:

Сериализация

DateTime dt = new DateTime(2006, 1, 2, 15, 4, 5, 999, DateTimeZone.UTC);
System.out.println(dt);

-------- OUTPUT --------
2006-01-02T15:04:05.999Z

Десериализация

DateTime dt = DateTime.parse("2006-01-02T15:04:05.999Z");
System.out.println(dt);

-------- OUTPUT --------
2006-01-02T15:04:05.999Z

Что касается стандартной библиотеки: при работе с часовыми поясами вы должны использовать ZonedDateTime вместо LocalDateTime .

...