我正在创建一个以JSON消息的形式接收请求的服务。我需要解析消息并根据请求类型采取适当的操作。例如(在伪代码):基于对象类型的反序列化JSON
switch(request.type) {
case "NewOrder":
createNewOrder(order);
break;
case "CancelOrder"
cancelOrder(orderId);
break;
}
似乎大多数JSON的API(至少是那些为你做的对象映射)需要根对象类型进行反序列化。有没有优雅的方法呢?
举例来说,杰克逊的API(使用全对象映射),我需要调用映射如下:
NewOrder newOrder = mapper.readValue(src, NewOrder.class);
CancelOrder cancelOrder = mapper.readValue(src. CancelOrder.class);
这意味着我需要知道对象的类我已经解析甚至在它。我真正需要的是一些方法来不期而遇的JSON字符串,确定该请求类型,然后调用相应的readValue()方法 - 是这样的:
String requestType = getRequestType(src);
switch(request.type) {
case "NewOrder":
NewOrder newOrder = mapper.readValue(src, NewOrder.class);
createNewOrder(newOrder.order);
break;
case "CancelOrder"
CancelOrder cancelOrder = mapper.readValue(src. CancelOrder.class);
cancelOrder(cancelOrder.orderId);
break;
}
是否有可能做到这一点使用杰克逊或其他任何Java JSON解析器?我确信我可以进入较低级别并使用流式API或基于节点的API,但如果可以的话,尽量避免这种复杂性。
刚刚开始使用Jackson,所以后续问题是Jackson API用于创建MAP的原因 - 就是他们的流API或Tree Model API。另外,如果杰克逊经历了创建地图的麻烦,我可以窥探请求类型并将剩下的地图交给杰克逊来构造“包装”对象 - 而不是使用BeanUtils? – Naresh 2011-04-16 18:24:16
是的,你可以!我编辑了我的答案来展示一个例子。 – 2011-04-16 21:29:40
太棒了 - 这应该适合我!与此同时,我制定了类似的解决方案。很快就会发布。唯一的区别是我读了JsonNode的树而不是HashMap。 – Naresh 2011-04-16 21:54:53