使用groovy.json序列化Joda DateTime
我有一个简单的pojo类,我想使用内置的Groovy JSON库将其序列化为JSON。但是,我的应用程序在尝试序列化时会停止使用groovy.json序列化Joda DateTime,json,serialization,groovy,jodatime,Json,Serialization,Groovy,Jodatime,我有一个简单的pojo类,我想使用内置的Groovy JSON库将其序列化为JSON。但是,我的应用程序在尝试序列化时会停止 class Fueling { int id; int mileage; double amount; double cost; DateTime dateTime; String userId; } 以下测试呈现java.lang.StackOverflower错误: @Test void parseJoda(){ def fueling = new Fuel
class Fueling {
int id;
int mileage;
double amount;
double cost;
DateTime dateTime;
String userId;
}
以下测试呈现java.lang.StackOverflower错误:
@Test
void parseJoda(){
def fueling = new Fueling(amount: 1.0, cost: 2.3, mileage: 123, dateTime: DateTime.now(DateTimeZone.UTC));
def jsonF = JsonOutput.toJson(fueling);
}
我怎样才能使这个序列化工作
编辑:JSON数据用于持久化,而不是用于显示目的,因此实际的序列化结果格式并不重要,只要我能够再次将其反序列化,只要您不关心格式,一个简单的解决方法是使用映射作为Groovy JSON API的输入/输出,然后添加一些代码来将域对象转换为映射和映射 序列化 您可以按原样使用
getProperties
返回的映射,并进行两个修改:将DateTime
实例转换为它的long
毫秒表示形式,并删除class
条目(这会导致内存错误)
反序列化
只需将dateTime
条目从long
转换回dateTime
实例,就可以将JsonSlurper吐出的映射直接传递给加油
构造函数
def deserialize() {
String json = '{"userId":null,"cost":2.3,"id":0,"dateTime":1439839235603,"amount":1.0,"mileage":123}'
Map props = new JsonSlurper().parseText(json)
new Fueling(props.collectEntries { k, v ->
[(k): k == 'dateTime' ? new DateTime(v) : v ] // convert back to DateTime
})
}
当然,当您的域对象树足够大/复杂,足以保证使用更可扩展的第三方JSON库时,就会出现这种情况。基于此链接--以及此链接--我认为您可能需要使用Jackson或Gson
def deserialize() {
String json = '{"userId":null,"cost":2.3,"id":0,"dateTime":1439839235603,"amount":1.0,"mileage":123}'
Map props = new JsonSlurper().parseText(json)
new Fueling(props.collectEntries { k, v ->
[(k): k == 'dateTime' ? new DateTime(v) : v ] // convert back to DateTime
})
}