我正在尝试接收我不知道的@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")
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>>
参数而不仅仅是地图