在Spring中接受任意JSON作为RequestBody

时间:2018-07-16 17:47:14

标签: java json spring spring-boot

正如标题所示,我希望我的控制器类在POST的一部分中接受(主要是)RequestBody中的任意JSON。在您问我为什么想要无法使用的JSON之前,这是因为JSON只是通过非常少的处理(仅提取一个字段)简单地传递到了存储后端。

此JSON中有三个必填字段:dataschemaresourceID。这是我的请求类的样子:

public class MyRequestBody implements Serializable {

    private JsonObject data;
    private JsonObject schema;
    private String resourceID;
    ...

我已经了解导致序列化不起作用的序列化问题。我不想进一步扩展此数据模型来为dataschema定义字段的原因是,我根本不知道它们将如何嵌套。这就是为什么我不简单地使用Map<String, String>

是否有一种简单的解决方案来接收RequestBody内的任意嵌套JSON数据,还是我不得不编写一个大型的强类型数据模型或将其作为Object接受,转换为JSON,并在其他地方进行所有字段验证?

控制器签名以供参考:

@RequestMapping(value = "test/data", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_UTF8_VALUE, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
    @ResponseBody
    public ResponseEntity<StorageData> publishData(@RequestBody MyRequest requestBody) {

这是一些示例JSON。在dataschema部分中出现问题的地方可能会包含我不知道的多层嵌套:

{
    "data": {
        "display": "bilbo_baggins"
    },
    "resourceID": "0123456789",
    "schema": {
        "type": "record",
        "namespace": "com.org.test",
        "name": "mySchema",
        "fields": [{
            "name": "display",
            "type": "string"
        }]
    }
}

1 个答案:

答案 0 :(得分:2)

  1. 您可以接收用于任意JSON的JsonNode对象

赞:

@RequestMapping(value = "test/data", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_UTF8_VALUE, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
@ResponseBody
public ResponseEntity<StorageData> publishData(@RequestBody JsonNode requestBody) {.. }
  1. 更改MyRequestBody类以将JsonNode代替JsonObject用于 data schema 。您不需要实现Serializable,除非您在代码中将其用于其他用途,但是不需要在请求中接收Json对象。