使用Groovy将bean序列化和反序列化为json

我已经通过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 } } 

解决方法

我找到了一个解决方法,但总体而言Json(de)序列化对日期非常混乱……

虽然http://groovy-lang.org/json.html声明支持java.util.date,但它依赖于“旧”RFC 822“yyyy-MM-dd’T’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’T’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

Gson 2.3.1开箱即用,但序列化为本地日期格式:{“name”:“John”,“registration”:“Oct 20,2011 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) } 

jackson

Jackson 2.4.4开箱即用,但序列化为epoch毫秒格式:
{ “名”: “约翰”, “登记”: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) } 

解决方案很好。 只是想更新我使用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} 

马特