Jackson Json对多个Hibernate对象进行序列化



我使用Hibernate 3获得了以下代码。

List queryResult = session.createQuery("SELECT A, B from A, B where A.id = B.id");
for (Object o: queryResult) {
     Object[] array = (Objec[]) o;
     A a = (A) array[0];
     B b = (B) array[1];
     //do work
}

这很好,因为我直接对hibernate查询结果进行操作。但是,我也想将queryResult序列化为一个字符串,以便以后可以使用它。我使用Jackson的json库尝试了以下操作:

ObjectMapper m = new ObjectMapper()
final String queryResultString = m.writeValueAsString(queryResult);

然后,稍后我尝试读取Json中的字符串并将其反序列化回Hibernate查询结果,这时我遇到了麻烦。读取代码:

List r = m.readValue(queryResultString, List.class);
for (Object o: r) {
     Object[] array = (Objec[]) o;
     A a = (A) array[0];
     B b = (B) array[1];
     //do work
}

Object[]的强制转换正在抱怨无法将ArrayList强制转换为对象数组。

我试着使用jackson hibernate模块,但也无济于事。所以我的问题是:a)对JSon序列化来说,正确的方法是什么?b) 为什么Jackson将它反序列化为arraylist?

假设

当与jackson连载时,您的列表将类似于:[[A_item,B_item],[A_item2,B_item2]。。。[A_itemn,B_itemn]]为什么?因为如果您愿意,您有一个列表列表或数组数组(第二个列表总是有两个元素,a和B)。

问题

您的列表未键入。因此,jackson将把json流反序列化为一个列表列表。因为当jackson遇到一个数组结构,并且不知道反序列化到哪种类型时,它会反序列化到List,而不是数组。

解决方案

1) 您不使用数组,而是使用列表,因为jackson默认情况下会反序列化为列表,而不是数组(这就是为什么会出现classcast异常的原因)。

2) 如果您在java5+下(这意味着您可以使用泛型),那么您可以使用jackson TypeReference类。

List listOfLists = mapper.readValue(queryResultString, new TypeReference<List<Object[]>>() {});

3) 你从杰克逊换成了根森http://code.google.com/p/genson/默认情况下将反序列化为数组,而不是列表。Genson提供了很多jackson没有的其他不错的功能,看看wikihttp://code.google.com/p/genson/wiki/GettingStarted.Genson需要java 6+

List r = new Genson().deserialize(queryResultString, List.class);
for (Object o: r) {
 Object[] array = (Objec[]) o;
    // it works!
    A a = (A) array[0];
 }

编辑你有一个forEach循环,我得出结论,你在java6+下,然后切换到Genson;)

最新更新