如何在Spring Boot Api post方法中接收自定义JSON对象

时间:2019-04-02 06:47:57

标签: java json spring-boot jackson domain-object

我正在尝试在@RequestBody中接收一个我不知道的JSON对象,即JSON对象可以是任何长度和数据。

比方说,JSON可能如下所示

{'seqNo': 10 }

{'country': 'US', 'state': 'CA'}

{'customer': 'Alex', product: 'UPS', date:'25-Mar-2018'}

在Spring Boot Api中,我有一种接收该JSON对象的方法。

@PostMapping(value = "/lookup")
public ResponseEntity<AppResponse> getLookup(@RequestBody LookupRequestObject lookupRequestObject) {

        // THIS METHOD KNOWS WHICH FIELD TO USE
        // FURTHER LOGIC WOULD BE HERE.


        return ResponseEntity.ok(response);

    }

我已阅读了有关Jackson序列化的内容,但仍在寻找解决方案。

Customize the Jackson ObjectMapper

任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:3)

您可以仅使用地图作为输入。 然后,您可以根据其包含的字段类型来访问地图中的文件。

@PostMapping(value = "/lookup")
public ResponseEntity<AppResponse> getLookup(@RequestBody Map<String, Object> lookupRequestObject) {

    // THIS METHOD KNOWS WHICH FIELD TO USE
    // FURTHER LOGIC WOULD BE HERE.

    return ResponseEntity.ok(response);
}

答案 1 :(得分:1)

如果未知JSON object结构,则可以始终使用Map<String, Object>类型并将其转换为POJO或直接在Map上工作。如果您需要POJO,可以使用convertValue方法:

@PostMapping(value = "/lookup")
public ResponseEntity<AppResponse> getLookup(@RequestBody Map<String, Object> payload) {
    // read map
    ObjectMapper objectMapper = new ObjectMapper();
    if (payload.containsKey("seqNo")) {
        Sequence seq = objectMapper.convertValue(payload, Sequence.class);
        // other logic
    } else if (payload.containsKey("country")) {
        Country country = objectMapper.convertValue(payload, Country.class);
    }
    // the same for other types

    // FURTHER LOGIC WOULD BE HERE.
    return ResponseEntity.ok(response);
}

您还可以尝试反序列化为com.fasterxml.jackson.databind.JsonNode,但是它将控制器与Jackson绑定在一起,这从另一方面来看是不好的。

答案 2 :(得分:1)

@Patrick Adler的回答绝对正确。您可以将Map用作方法的参数。两个重要的补充:Map对应于JSON Object,因此当将JSON对象传递给您的方法Spring(默认情况下使用Jackson)会将其转换为Map,因此不需要其他代码。另外,请确保可以将希望接收JSON输入的注释添加到注释中: 因此,更改行

@PostMapping(value = "/lookup")

@PostMapping(value = "/lookup", headers = "Accept=application/json")

最后,您发布的输入不是有效的单个JSON对象。它是3个独立的JSON对象。因此,您可以期望包含JSON对象的JSON数组或单个JSON对象。如果期望使用JSON数组,则在方法中使用Map<String, Object>而不是List<Map<String, Object>>参数,因此解决方案应为

@PostMapping(value = "/lookup", headers = "Accept=application/json")
public ResponseEntity<AppResponse> getLookup(@RequestBody Map<String, Object> lookupRequestObject) {

    // THIS METHOD KNOWS WHICH FIELD TO USE
    // FURTHER LOGIC WOULD BE HERE.

    return ResponseEntity.ok(response);
}

或相同,但具有List<Map<String, Object>>参数,而不仅仅是map