问题描述
Json 只有整数和字符串。我有一个“列表”,里面有“地图”,我没有附上数据,因为它们可以是任意的。问题是我在这个“字符串”类型的“列表”中有一个日期,我该如何更改为“日期”类型?在代码 list.each 和 map.each 中,某个步骤的值将是 String 类型的日期值,我可以使用正则表达式检查日期,但如何将其更改为日期? map.put?
def list = jsonSlurper.parseText JSON
def typeMap = [:].withDefault { key -> "String" }
list.each { map ->
map.each { key,values ->
if (values != null) {
typeMap[key] = getTypeDef(values)
println('value ' + values + ' typeMap ' + typeMap[key])
//typeMap[key] = values.getClass().simpleName
}
}
}
用于测试值将被日期掩盖以更改类型的正则表达式。
if (values ==~ /^(0?[1-9]|[12][0-9]|3[01])[\\/\-.](0?[1-9]|1[012])[\\/\-.]\d{4}\s[0-2]?[0-9]:[0-5][0-9]:[0-5][0-9]\u0024/){}
解决方法
不是最优的,但对于小 jsons 应该有效
import groovy.json.*
def JSON='''
{"a":[{"d1":"2021-02-25 18:56:13","s":"s123","i":456}]}
'''
def detectDates(Object o){
if(o instanceof List)return o.collect{ detectDates(it) }
if(o instanceof Map)return o.collectEntries{k,v-> [k,detectDates(v)] }
if(o instanceof String && o==~/\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}/)return Date.parse('yyyy-MM-dd HH:mm:ss',o)
return o
}
def o = new JsonSlurper().parseText(JSON)
assert o.a[0].d1 instanceof String
o = detectDates(o)
assert o.a[0].d1 instanceof Date
println new JsonBuilder(o).toPrettyString()