gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 02:24:53 27 4
gpt4 key购买 nike

我读过关于 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

Gson 2.3.1 可以开箱即用,但序列化为本地日期格式:{"name":"John","re​​gistration":"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 可以开箱即用,但序列化为纪元毫秒格式:
{“姓名”:“约翰”,“注册”: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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com