Groovy: дельта даты и времени и JsonOutput.toJson - PullRequest
0 голосов
/ 14 января 2019

Я пытаюсь вернуть некоторые данные из базы данных. Когда я вызываю метод JsonOutput.toJson() с предоставленными данными, он автоматически меняет дельту моего времени данных.

Это мой код:

def result = groovy.json.JsonOutput.toJson(data)

println(data)
println(result)

response.setContentType("application/json");

Первый печатает следующее:

[[ DateStart:2019-01-14 09:34:51.0, DateEnd:2019-01-14 10:27:22.68]]

А вторая после форматирования json показывает другую дату (часы - 1):

[{"DateStart":"2019-01-14T08:34:51+0000","DateEnd":"2019-01-14T09:27:22+0000"}]

Какие-нибудь советы по форматированию в JSON без изменения даты / дельты?

1 Ответ

0 голосов
/ 14 января 2019

На основе формата вывода data.toString():

[[ DateStart:2019-01-14 09:34:51.0, DateEnd:2019-01-14 10:27:22.68]]

похоже, что вы имеете дело с сериализацией JSON типа java.sql.Timestamp. Если вы хотите запретить использование сериализатора меток времени по умолчанию, вам придется вручную форматировать метки времени, прежде чем произойдет сериализация JSON.

Рассмотрим следующий пример:

import groovy.json.JsonOutput
import java.sql.Timestamp

def format = "yyyy-MM-dd'T'hh:mm:ss.S"
def date = new Date().parse(format, "2019-01-14T09:34:51.0")

def dateStart = new Timestamp(date.time)
def dateEnd = new Timestamp((date + 20).time)

def data = [[DateStart: dateStart, DateEnd: dateEnd]]

println "Raw data:"
println data

println "\nJSON without formatting:"
println JsonOutput.toJson(data)

data = data.collect { el -> el.collectEntries { k,v ->
    def value = v instanceof Timestamp ? v.format(format) : v
    return [(k): value]
}}

println "\nJSON after formatting:"
println JsonOutput.toJson(data)

Выход:

Raw data:
[[DateStart:2019-01-14 09:34:51.0, DateEnd:2019-02-03 09:34:51.0]]

JSON without formatting:
[{"DateStart":"2019-01-14T08:34:51+0000","DateEnd":"2019-02-03T08:34:51+0000"}]

JSON after formatting:
[{"DateStart":"2019-01-14T09:34:51.0","DateEnd":"2019-02-03T09:34:51.0"}]

Самая важная часть (форматирование значения метки времени в его строковое представление) происходит в следующей части:

data = data.collect { el -> el.collectEntries { k,v ->
    def value = v instanceof Timestamp ? v.format(format) : v
    return [(k): value]
}}

Предполагается, что ваш список карт может содержать другие пары ключ-значение, которые не содержат значения метки времени. Если мы имеем дело с отметкой времени, мы форматируем ее с использованием формата yyyy-MM-dd'T'hh:mm:ss.S и в противном случае возвращаем неизмененное значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...