gpt4 book ai didi

java - 根据对象类型反序列化 JSON

转载 作者:搜寻专家 更新时间:2023-11-01 01:57:21 25 4
gpt4 key购买 nike

我正在创建一个以 JSON 消息形式接收请求的服务。我需要解析消息并根据请求类型采取适当的操作。例如(伪代码):

switch(request.type) {
case "NewOrder":
createNewOrder(order);
break;
case "CancelOrder"
cancelOrder(orderId);
break;
}

似乎大多数 JSON API(至少是那些为您执行对象映射的 API)都需要根对象类型来反序列化。有什么优雅的方法可以解决这个问题吗?

例如,在 Jackson 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;
}

是否可以使用 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);
}
}

关于java - 根据对象类型反序列化 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5688246/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com