java 使用 Groovy 将 bean 序列化和反序列化为 json
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/27250386/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Serialize & Deserialize bean to json with Groovy
提问by Wavyx
I've read this news about json with groovy http://www.infoq.com/news/2014/04/groovy-2.3-json. So I tried to native methods to (de)serialization of groovy bean containing dates. But I have issues whent using JsonOutput.toJson(object) with JsonObject.fromObject() with java.util.Date
我已经用 groovy http://www.infoq.com/news/2014/04/groovy-2.3-json阅读了有关 json 的新闻。因此,我尝试使用本机方法对包含日期的 groovy bean 进行(反)序列化。但是我在使用 JsonOutput.toJson(object) 和 JsonObject.fromObject() 和 java.util.Date 时遇到问题
String jsonDat a= groovy.json.JsonOutput.toJson(contact)
Contact reloadContact = new Contact(net.sf.json.JSONObject.fromObject(jsonData))
What is the right way to to this with native methods in groovy 2.3+ ?
在 groovy 2.3+ 中使用本机方法的正确方法是什么?
Otherwise, I could go for another library like gson (http://www.mkyong.com/java/how-do-convert-java-object-to-from-json-format-gson-api/)
否则,我可以去另一个像 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
}
}
Edit: I also tried with JsonSlurper, but always get the GroovyCastException: Cannot cast object '2011-10-19T22:00:00+0000' with class 'java.lang.String' to class 'java.util.Date' package test
编辑:我也尝试过使用 JsonSlurper,但总是得到 GroovyCastException:Cannot cast object '2011-10-19T22:00:00+0000' with class 'java.lang.String' to class 'java.util.Date' package test
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
}
}
采纳答案by Wavyx
Workaround
解决方法
I found a workaround, but overall the Json (de)serialization is quite messy with dates...
我找到了一个解决方法,但总的来说 Json(反)序列化与日期相当混乱......
While http://groovy-lang.org/json.htmlstates support for java.util.date it still relies on the "old" RFC 822 "yyyy-MM-dd'T'HH:mm:ssZ" see https://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html#timezone(Java 6.0 and below)
虽然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(Java6.0 及以下)
Java 7.0 introduced the ISO 8601 support with "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"
Java 7.0 通过“yyyy-MM-dd'T'HH:mm:ss.SSSXXX”引入了 ISO 8601 支持
This bug http://jira.codehaus.org/browse/GROOVY-6854is still present in Groovy 2.3.7. Moreover the default JsonSlurper is not converting date by default. Only JsonParserLax and JsonFastParser seems to care about Date parsing, so you need to force the right Parser type.
这个错误http://jira.codehaus.org/browse/GROOVY-6854在 Groovy 2.3.7 中仍然存在。此外,默认的 JsonSlurper 不会默认转换日期。似乎只有 JsonParserLax 和 JsonFastParser 关心 Date 解析,所以需要强制使用正确的 Parser 类型。
Current workaround based on GROOVY-6854:
当前基于 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)
}
I hope the (de)serialization conventions for JSON will be enforced in upcoming release.
我希望在即将发布的版本中强制执行 JSON 的(反)序列化约定。
For the sake of completeness, I also tried other libraries here are my other tests:
为了完整起见,我还尝试了其他库,这是我的其他测试:
Boon
恩恩
Boon 0.30 gets lost in serializing Groovy object (metaClass) and throws org.boon.Exceptions$SoftenedException for "Detected circular dependency"
Boon 0.30 在序列化 Groovy 对象(元类)时丢失,并为“检测到的循环依赖项”抛出 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 worksout-of-the-box but serializes to a Local Date format: {"name":"John","registration":"Oct 20, 2011 12:00:00 AM"}
GSON 2.3.1作品外的即装即用,但序列化到本地日期格式:{“名”:“约翰”,“登记”:“二零一一年十月二十〇日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)
}
Hymanson
Hyman逊
Hymanson 2.4.4 worksout-of-the-box but serializes to epoch millisecond format:
{"name":"John","registration":1319061600000}
Hyman逊2.4.4 作品外的即装即用,但序列化为划时代毫秒格式:
{“名”:“约翰”,“登记”:1319061600000}
public void serializationHymanson(){
Contact contact = new Contact()
contact.name = 'John'
contact.registration = Date.parse('dd/MM/yyyy', '20/10/2011')
com.fasterxml.Hymanson.databind.ObjectMapper mapper = new com.fasterxml.Hymanson.databind.ObjectMapper();
String jsonData = mapper.writeValueAsString(contact)
println(jsonData)
Contact reloadContact = mapper.readValue(jsonData, Contact.class)
}
回答by Matthew Payne
Work arounds are good. Just want to update I used groovy 2.4.5 and the problem looks to be fixed.
变通办法很好。只是想更新我使用了 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)
outputs
输出
{"publishDate":"2011-10-20T04:00:00+0000","title":"our mork book","publisher":"matt payne","isbn":"dfjkad","price":5.00,"quantity":6,"author":null}