使用groovy.json

时间:2015-08-16 13:48:32

标签: json serialization groovy jodatime

我有这个简单的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数据用于持久化而不是用于显示属性,因此实际的序列化结果格式并不重要,只要我能够再次反序列化

1 个答案:

答案 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库。