我有这个简单的pojo类Fueling,我想使用内置的Groovy JSON库序列化为JSON。但是,我的应用程序在尝试序列化时停止。
class Fueling {
int id;
int mileage;
double amount;
double cost;
DateTime dateTime;
String userId;
}
以下测试呈现java.lang.StackOverflowError:
@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数据用于持久化而不是用于显示属性,因此实际的序列化结果格式并不重要,只要我能够再次反序列化
答案 0 :(得分:3)
如果您不关心格式,一个简单的解决方法是使用Maps作为您的Groovy JSON API输入/输出,然后添加一些代码来将您的域对象转换为地图。
<强>序列化强>
您可以使用getProperties
按原样返回的地图进行两项修改:将DateTime
实例转换为long
毫秒表示并删除{{ 1}}条目(导致我的内存错误)
class
<强>反序列化强>
您可以将JsonSlurper直接吐出的地图直接传递给def serialize(){
def fueling = new Fueling(amount: 1.0, cost: 2.3, mileage: 123, dateTime: DateTime.now(DateTimeZone.UTC));
JsonOutput.toJson(
fueling.properties.collectEntries { k, v ->
[(k): k == 'dateTime' ? v.millis : v] // represent DateTime as milliseconds
}.findAll {
it.key != 'class' // remove the unnecessary 'class' property
}
)
}
构造函数,稍加修改,将Fueling
条目从dateTime
转换回long
实例
DateTime
当然,有一点是您的域对象树足够大/复杂,足以保证使用更具扩展性的第三方JSON库。