如何在 Spring 启动 API 发布方法中接收自定义的 JSON 对象



我正在尝试接收我不知道的@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 ObjectMapper

任何帮助将不胜感激。

您可以使用地图进行输入。然后,您可以根据地图中包含的字段类型访问地图中的字段。

@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);
}

如果结构未知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绑定在一起,这在另一端并不好。

@Patrick Adler的回答是绝对正确的。可以使用 Map 作为方法的参数。两个重要的补充:map对应于JSON对象,所以当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>>参数而不仅仅是地图

相关内容

  • 没有找到相关文章

最新更新