为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

临摹微笑 2022-09-14 17:20:07
我正在尝试接收@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);    }我已经阅读了有关杰克逊序列化的文章,但仍然在寻找解决方案。自定义杰克逊对象映射器任何帮助将不胜感激。
查看完整描述

3 回答

?
慕村9548890

TA贡献1884条经验 获得超4个赞

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


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

}


查看完整回答
反对 回复 2022-09-14
?
catspeake

TA贡献1111条经验 获得超0个赞

如果结构未知,则始终可以使用 type 并将其转换为 或直接在 上工作。如果您需要,可以使用以下方法:JSON objectMap<String, Object>POJOMapPOJOconvertValue


@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.JsonNodeJackson


查看完整回答
反对 回复 2022-09-14
?
慕容森

TA贡献1853条经验 获得超18个赞

可以使用 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) {


    // THIS METHOD KNOWS WHICH FIELD TO USE

    // FURTHER LOGIC WOULD BE HERE.


    return ResponseEntity.ok(response);

}

List<Map<String, Object>>


查看完整回答
反对 回复 2022-09-14
  • 3 回答
  • 0 关注
  • 112 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信