我正在尝试在@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
任何帮助将不胜感激。
答案 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")
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