基于对象类型反序列化 JSON

Nar*_*esh 4 java json jackson

我正在创建一个以 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,但如果可以,我会尽量避免这种复杂性。

Sim*_* G. 5

如果使用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)