使用groovy.json序列化Joda DateTime

使用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

我有一个简单的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 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
    })
}