我正在尝试从数据库中返回一些数据。当我使用提供的数据调用方法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的任何技巧吗?
答案 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
格式对其进行格式化,否则将返回未修改的值。