Groovy:日期时间增量和JsonOutput.toJson

时间:2019-01-14 09:29:51

标签: groovy

我正在尝试从数据库中返回一些数据。当我使用提供的数据调用方法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 :(得分:0)

基于data.toString()输出格式:

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

您似乎正在处理java.sql.Timestamp类型的JSON序列化。如果要阻止使用默认的时间戳序列化程序,则必须在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格式对其进行格式化,否则将返回未修改的值。