我正在創建一個以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