我正在创建一个以 JSON 消息形式接收请求的服务。我需要解析消息并根据请求类型采取适当的操作。例如(在伪代码中):
switch(request.type) {
case "NewOrder":
createNewOrder(order);
break;
case "CancelOrder"
cancelOrder(orderId);
break;
}
Run Code Online (Sandbox Code Playgroud)
似乎大多数 JSON API(至少那些为您做对象映射的 API)需要根对象类型来反序列化。有没有什么优雅的方法来解决这个问题?
例如,在 Jackson API(使用完整对象映射)中,我需要按如下方式调用映射器:
NewOrder newOrder = mapper.readValue(src, NewOrder.class);
CancelOrder cancelOrder = mapper.readValue(src. CancelOrder.class);
Run Code Online (Sandbox Code Playgroud)
这意味着我需要在解析对象之前就知道它的类。我真正需要的是某种方式来查看 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;
}
Run Code Online (Sandbox Code Playgroud)
是否可以使用 Jackson 或任何其他 Java JSON 解析器来做到这一点?我确信我可以进入较低级别并使用流式 API 或基于节点的 API,但如果可以,我会尽量避免这种复杂性。
如果使用Jackson将 JSON 输入解析为 Map,则可以快速访问类型信息。然后,您可以将对象创建为所需的类,并使用ObjectMapper.convert从 Jackson 获得的 Map 配置对象。
下面是一个例子:
public class Test1 {
private String f;
private String b;
public void setFoo(String v) { f = v; }
public void setBim(String v) { b = v; }
public String toString() { return "f=" + f + ", b=" + b; }
public static void main(String[] args) throws Exception {
String test = "{ \"foo\":\"bar\", \"bim\":\"baz\" }";
ObjectMapper mapper = new ObjectMapper();
HashMap map = mapper.readValue(new StringReader(test), HashMap.class);
System.out.println(map);
Test1 test1 = mapper.convertValue(map, Test1.class);
System.out.println(test1);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8953 次 |
| 最近记录: |