如何在春季启动 API 后方法中接收自定义的 JSON 对象

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


比方说,JSON 可以如下所示


{'seqNo': 10 }


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


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

在春季启动 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);


    }

我已经阅读了有关杰克逊序列化的文章,但仍然在寻找解决方案。


自定义杰克逊对象映射器

任何帮助将不胜感激。


临摹微笑
浏览 113回答 3
3回答

慕村9548890

您可以只使用地图进行输入。然后,您可以根据地图中包含的字段类型访问地图中的字段。@PostMapping(value = "/lookup")public ResponseEntity<AppResponse> getLookup(@RequestBody Map<String, Object> lookupRequestObject) {&nbsp; &nbsp; // THIS METHOD KNOWS WHICH FIELD TO USE&nbsp; &nbsp; // FURTHER LOGIC WOULD BE HERE.&nbsp; &nbsp; return ResponseEntity.ok(response);}

catspeake

如果结构未知,则始终可以使用 type 并将其转换为 或直接在 上工作。如果您需要,可以使用以下方法:JSON objectMap<String, Object>POJOMapPOJOconvertValue@PostMapping(value = "/lookup")public ResponseEntity<AppResponse> getLookup(@RequestBody Map<String, Object> payload) {&nbsp; &nbsp; // read map&nbsp; &nbsp; ObjectMapper objectMapper = new ObjectMapper();&nbsp; &nbsp; if (payload.containsKey("seqNo")) {&nbsp; &nbsp; &nbsp; &nbsp; Sequence seq = objectMapper.convertValue(payload, Sequence.class);&nbsp; &nbsp; &nbsp; &nbsp; // other logic&nbsp; &nbsp; } else if (payload.containsKey("country")) {&nbsp; &nbsp; &nbsp; &nbsp; Country country = objectMapper.convertValue(payload, Country.class);&nbsp; &nbsp; }&nbsp; &nbsp; // the same for other types&nbsp; &nbsp; // FURTHER LOGIC WOULD BE HERE.&nbsp; &nbsp; return ResponseEntity.ok(response);}您也可以尝试反序列化到,但它绑定了从另一端不好的控制器。com.fasterxml.jackson.databind.JsonNodeJackson

慕容森

可以使用 Map 作为方法的参数。两个重要的补充:映射对应于 JSON 对象,因此当 JSON 对象传递到您的方法时,Spring(默认使用 Jackson)会将其转换为映射,因此不需要其他代码。另外,为了确保您可以向注释中添加您希望接收的 JSON 输入:因此请更改该行@PostMapping(value = "/lookup")自@PostMapping(value = "/lookup", headers = "Accept=application/json")最后,您发布的输入不是有效的单个 JSON 对象。它是 3 个独立的 JSON 对象。因此,您需要一个包含 JSON 对象的 JSON 数组,或者一个 JSON 对象。如果你想要一个JSON数组,那么在你的方法中使用参数,所以你的解决方案应该看起来要么是一样的,但带有参数,而不仅仅是mapMap<String, Object>List<Map<String, Object>>@PostMapping(value = "/lookup", headers = "Accept=application/json")public ResponseEntity<AppResponse> getLookup(@RequestBody Map<String, Object> lookupRequestObject) {&nbsp; &nbsp; // THIS METHOD KNOWS WHICH FIELD TO USE&nbsp; &nbsp; // FURTHER LOGIC WOULD BE HERE.&nbsp; &nbsp; return ResponseEntity.ok(response);}List<Map<String, Object>>
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java