- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我读过关于 json with groovy 的新闻 http://www.infoq.com/news/2014/04/groovy-2.3-json . 因此,我尝试使用 native 方法对包含日期的 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))
在 groovy 2.3+ 中使用 native 方法的正确方法是什么?
否则,我可以去另一个像 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: Cannot cast object '2011-10-19T22:00:00+0000' with class 'java.lang.String' to class '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(反)序列化对于日期来说相当困惑......
同时 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 通过“yyyy-MM-dd'T'HH:mm:ss.SSSXXX”引入了 ISO 8601 支持
这个错误 http://jira.codehaus.org/browse/GROOVY-6854在 Groovy 2.3.7 中仍然存在。此外,默认 JsonSlurper 默认不转换日期。只有 JsonParserLax 和 JsonFastParser 似乎关心日期解析,因此您需要强制使用正确的解析器类型。
基于 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","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 2.4.4 可以开箱即用,但序列化为纪元毫秒格式:
{“姓名”:“约翰”,“注册”: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)
}
关于java - 使用 Groovy 将 bean 序列化和反序列化为 json,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27250386/
出于好奇,我尝试了一些原型(prototype)制作,但似乎只允许在第一个位置使用子例程的原型(prototype) &。 当我写作时 sub test (&$$) { do_somethin
我需要开发一个类似于 Android Play 商店应用程序或类似 this app 的应用程序.我阅读了很多教程,发现几乎每个教程都有与 this one 类似的例子。 . 我已经开始使用我的应用程
考虑一个表示“事件之间的时间”的列: (5, 40, 3, 6, 0, 9, 0, 4, 5, 18, 2, 4, 3, 2) 我想将这些分组到 30 个桶中,但桶会重置。期望的结果: (0, 1,
我是一名优秀的程序员,十分优秀!