首页 > 解决方案 > 将请求体中封装的 JSON 数据反序列化为两个不同的模型对象

问题描述

我正在学习 SpringBoot 并且正在做这个编码挑战。到目前为止,我已经成功设置了控制器并完成了映射。

@RestController
@RequestMapping(path="/mydomain")
public class PaymentController {

@RequestMapping(method=RequestMethod.POST, value="/ingest")
public void ingestData(@RequestBody String data) {
  System.out.println("ingest Data");
  System.out.println(data);

  // List<Orders>
  // List<Returns>
}

 @RequestMapping(method=RequestMethod.GET, value="/query")
public String queryData(@RequestBody String data) {
  // look at LIST of order and return..and return something
} 

}

String 数据是 JSON,它包含两种不同的类型- Order 和 Return。

{
"entries": {

    {
        type: "ORDER",
        name: "order_1",
        "attributes": {
            "owner": "John"
        }
    },
    {
        type: "ORDER",
        name: "order_2",
        "attributes": {
            "owner": "Mike",
            "buyer": "Bob"
        }
        // attributes is a key/value pair Map
    },
    {
        type: "RETURN",
        name: "return_1",
        "attributes": {
            "user": "kelly",
            "time": "null",
            "inputs": [
                "USD",
                "EUR"
            ],
            "outputs": [
                "CAD",
                "GBP"
            ]
        }
        // attributes is a key/value pair Map
    },
}

}

在 ingestData() 中,我想解析 json 并创建 2 个列表 - 每个列表用于订单和退货。过去,我处理过 json 映射到同一个 Java 类的所有项目。如何解析 json 项并将其映射到 2 个不同的 java 类中?

标签: javaspringspring-bootspring-mvc

解决方案


您可能应该重新考虑一下您的 REST api 设置。最好基于类创建端点,而不是拥有处理多个的通用端点。尽管现在这看起来像是更多的工作,但它确实会帮助您生成更多可维护的代码。您现在遇到了这个问题,您希望 ObjectMapper 从单个 Json 解析为不同的类,这一事实很好地表明您走错了方向。

Stack 上有一个很棒的 REST API 设计最佳实践


推荐阅读