我正在尝试将JSON对象编组到包含通用对象的包装类中,以及有关该对象签名的其他信息。
public class Signable<T> {
private T object;
private String signature;
public class Signable() {
generateSignature();
}
/* Getters and setters */
}
只要我使用已创建的对象构造它,包装器类就可以正常工作,并且它能够生成所需的json
@RequestMapping(value="/test/json/return",method=RequestMethod.GET)
public @ResponseBody Signable<Cart> getTest()
{
Cart cart = new Cart();
// populate cart with OrderItems ...
Signable<Cart> sign = new Signable<Cart>();
sign.setObject(cart);
return sign;
}
能够生成预期的输出
{
"object":{
"orderItems":[
{
"id": "****",
"desc": "asdlfj",
"price": 25.53
}
]
},
"signature":"s9d94f9f9gdfg67d8678g6s87d6f7g6";
}
我想要的格式是什么。但是,当尝试将从Signable生成的相同json编组回Signable时,我收到以下错误:
java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to Cart
由于某种原因,它无法确定json中的“object”应该映射到Cart的类型(它只是默认为LinkedHashMap),即使它是在方法头中指定的。
@RequestMapping(value="/test/json/post",method=RequestMethod.POST)
public @ResponseBody Signable<Cart> postTest(@RequestBody Signable<Cart> sign)
有没有办法明确说明要从JSON生成哪些类型的对象来代替通用?
非常感谢任何帮助。
感谢。
答案 0 :(得分:10)
这里的问题是传递正确的类型信息,填写缺少的信息(由于Java类型擦除而发生)。
但最简单的方法通常是你想要的子类型,有类似的东西:
class CartSignable extends Signable<Cart> { }
并使用它,而不是构建通用实例;如果是这样,则正确包含类型信息(因为它存储在CartSignable的类定义中;而Signable只有类型变量!)。
Jackson也可以在序列化过程中接收类型信息,但这里的问题是Spring如何传递这些信息。因此,通常使用子分类风格更容易。请注意,您也可以使用匿名内部类进行子类化。
答案 1 :(得分:4)
我最终延长了
class ListMyObject extends ArrayList<MyObject> { }
谢谢StaxMan - 非常有帮助
PS:json格式&gt;
[{“id”:“1”,“mountain”:2},{“id”:“3”,“mountain”:7}]
答案 2 :(得分:0)
我最后创建了另一个类:
public class JobUpdateList extends ArrayList<JobUpdate> implements Serializable {
//---- Members
private static final long serialVersionUID = 1L;
}
所以在控制器中,而不是:
public @ResponseBody String setJobStatus(@RequestBody List<JobUpdate> jobUpdates) {
我这样做了:
public @ResponseBody String setJobStatus(@RequestBody JobUpdateList jobUpdates) {