我已经通过groovy http://www.infoq.com/news/2014/04/groovy-2.3-json阅读了有关json的新闻。 所以我尝试了本地方法来(de)序列化包含日期的groovy bean。 但我有问题,使用JsonOutput.toJson(对象)和JsonObject.fromObject()与java.util.Date
String jsonDat a= groovy.json.JsonOutput.toJson(contact)
Contact reloadContact = new Contact(net.sf.json.JSONObject.fromObject(jsonData))
在groovy 2.3+中使用原生方法的正确方法是什么?
否则,我可以去另一个像gson(http://www.mkyong.com/java/how-do-convert-java-object-to-from-json-format-gson-api/)
这样的库package test
import groovy.json.JsonOutput
import net.sf.json.JSONObject
class JsonTest {
public static void main(String[] args) {
JsonTest test = new JsonTest()
test.serialization()
}
public void serialization(){
Contact contact = new Contact()
contact.name = 'John'
contact.registration = Date.parse('dd/MM/yyyy', '20/10/2011')
String jsonData = JsonOutput.toJson(contact)
println(jsonData)
Object object = JSONObject.fromObject(jsonData)
Contact reloadContact = new Contact(object)
println(jsonData)
}
public class Contact{
String name
Date registration
}
}
编辑:我也尝试过使用JsonSlurper,但总是得到GroovyCastException:无法将类'java.lang.String'的对象'2011-10-19T22:00:00 + 0000'转换为类'java.util.Date “ 包装测试
import groovy.json.JsonOutput
import groovy.json.JsonSlurper
class JsonTest {
public static void main(String[] args) {
JsonTest test = new JsonTest()
test.serialization()
}
public void serialization(){
Contact contact = new Contact()
contact.name = 'John'
contact.registration = Date.parse('dd/MM/yyyy', '20/10/2011')
String jsonData = JsonOutput.toJson(contact)
println(jsonData)
JsonSlurper slurper = new JsonSlurper()
def object = slurper.parseText(jsonData)
Contact reloadContact = new Contact(object)
println(jsonData)
}
public class Contact{
String name
Date registration
}
}
答案 0 :(得分:4)
我找到了一个解决方法,但总体而言Json(de)序列化与日期相当混乱......
虽然http://groovy-lang.org/json.html州支持java.util.date,但它仍然依赖于" old" RFC 822" yyyy-MM-dd' HH:mm:ssZ"见https://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html#timezone(Java 6.0及以下)
Java 7.0引入了ISO 8601支持" yyyy-MM-dd' HH:mm:ss.SSSXXX"
这个错误http://jira.codehaus.org/browse/GROOVY-6854仍然存在于Groovy 2.3.7中。此外,默认情况下,默认的JsonSlurper不会转换日期。只有JsonParserLax和JsonFastParser似乎关心Date解析,所以你需要强制使用正确的Parser类型。
基于GROOVY-6854的当前解决方法:
public void serializationNative(){
Contact contact = new Contact()
contact.name = 'John'
contact.registration = Date.parse('dd/MM/yyyy', '20/10/2011')
def sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX")
sdf.setTimeZone(TimeZone.getTimeZone('UTC'))
JsonOutput.dateFormatter.set(sdf)
String jsonData = JsonOutput.toJson(contact)
println(jsonData)
JsonSlurper slurper = new JsonSlurper().setType( JsonParserType.INDEX_OVERLAY )
def object = slurper.parseText(jsonData)
Contact reloadContact = new Contact(object)
}
我希望JSON的(反)序列化约定将在即将发布的版本中实施。
为了完整起见,我还尝试了其他库,这是我的其他测试:
Boon 0.30在序列化Groovy对象(metaClass)时丢失并抛出org.boon.Exceptions $ SoftenedException为"检测到循环依赖"
public void serializationBoon(){
Contact contact = new Contact()
contact.name = 'John'
contact.registration = Date.parse('dd/MM/yyyy', '20/10/2011')
ObjectMapper mapper = JsonFactory.create()
String jsonData = mapper.toJson(contact)
println(jsonData)
Contact reloadContact = mapper.fromJson(jsonData, Contact.class)
}
Gson 2.3.1 工作开箱即用,但序列化为本地日期格式:{" name":" John",& #34;注册":" 2011年10月20日12:00:00 AM"}
public void serializationGson(){
Contact contact = new Contact()
contact.name = 'John'
contact.registration = Date.parse('dd/MM/yyyy', '20/10/2011')
Gson gson = new Gson()
String jsonData = gson.toJson(contact)
println(jsonData)
Contact reloadContact = gson.fromJson(jsonData, Contact.class)
println(jsonData)
}
杰克逊2.4.4 工作开箱即用,但序列化为纪元毫秒格式:
{" name":" John"," registration":1319061600000}
public void serializationJackson(){
Contact contact = new Contact()
contact.name = 'John'
contact.registration = Date.parse('dd/MM/yyyy', '20/10/2011')
com.fasterxml.jackson.databind.ObjectMapper mapper = new com.fasterxml.jackson.databind.ObjectMapper();
String jsonData = mapper.writeValueAsString(contact)
println(jsonData)
Contact reloadContact = mapper.readValue(jsonData, Contact.class)
}
答案 1 :(得分:1)
周围的工作很好。只是想更新我使用groovy 2.4.5并且问题看起来是固定的。
Book b = new Book(isbn:'dfjkad',quantity: 6, price: 5.00, title: "our mork book",
publishDate: Date.parse('dd/MM/yyyy', '20/10/2011'), publisher: "matt payne")
render JsonOutput.toJson(b)
输出
{"publishDate":"2011-10-20T04:00:00+0000","title":"our mork book","publisher":"matt payne","isbn":"dfjkad","price":5.00,"quantity":6,"author":null}