多个Hibernate对象的Jackson Json序列化
我使用Hibernate3编写了以下代码多个Hibernate对象的Jackson Json序列化,json,hibernate,serialization,jackson,deserialization,Json,Hibernate,Serialization,Jackson,Deserialization,我使用Hibernate3编写了以下代码 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 } 这很好,因为我直接对hib
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
}
对象[]的强制转换抱怨无法将ArrayList强制转换为对象数组
我尝试使用jackson hibernate模块,但也没用。所以我的问题是:a)使用JSon序列化的正确方法是什么?b) 为什么Jackson将其反序列化到arraylist 假设 当使用jackson序列化时,您的列表将类似于: [[A_项目,B_项目],[A_项目2,B_项目2],…[A_项目n,B_项目n]] 为什么?因为您有一个列表列表或数组数组(如果愿意的话)(第二个列表将始终有两个元素,a和B) 问题 您的列表未键入。因此jackson将json流反序列化为列表列表。 因为当jackson遇到数组结构并且不知道反序列化到哪种类型时,它将反序列化到列表而不是数组 解决方案 1) 与使用数组不同,您使用的是列表,因为jackson默认情况下将反序列化为列表而不是数组(这就是为什么会出现classcast异常) 2) 如果您使用的是Java5+(这意味着您可以使用泛型),那么您可以使用jackson TypeReference类
List listOfLists = mapper.readValue(queryResultString, new TypeReference<List<Object[]>>() {});
编辑
您有一个forEach循环,我断定您在Java6+下,然后切换到Genson;) 2)不起作用--它确实传递了Object[]强制转换语句,但对象(A)数组[0]的实际强制转换失败,出现异常:无法将LinkedHashMap强制转换为A。3)Genson不起作用,因为它无法序列化A。1)您的A和B是复杂类型,默认情况下Jackson不知道要反序列化的类型。这就是他反序列化到地图的原因。2) 你能展示一下你的飞机是什么样子吗?我很惊讶序列化失败了……A和B是hibernate对象——即使用hibernate查询mysql返回的对象。我考虑到序列化可能会丢失类信息,并尝试为对象映射器添加hibernateModule,但也不起作用。
List r = new Genson().deserialize(queryResultString, List.class);
for (Object o: r) {
Object[] array = (Objec[]) o;
// it works!
A a = (A) array[0];
}