后端获取json对象的方式

这篇博客探讨了Java后端处理HTTP请求时,针对JSON格式和form-data类型的参数接收与解析的多种方式,包括使用JSONObject、Map以及Hutool工具。同时,展示了如何通过@RequestParam和直接使用实体类来处理form-data请求。这些方法在实际开发中非常常见,有助于理解后端接口设计和参数处理流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 传入参数格式

{
    "contractId": 2611141940251005036,
    "documentParams": [
        {
            "name": "乙方姓名2",
            "value": "邓茜茜"
        },
        {
            "name": "乙方姓名3",
            "value": "邓茜"
        }
    ]
}

在这里插入图片描述


2. 后端接收和解析方式

  1. 使用JSONObject:
@PostMapping("/contract/fillParams")
    public Result<String> fillParams(@RequestBody JSONObject object){
        Result<String> result = new Result<>();
        String contractId = object.getString("contractId");
        String bizId = object.getString("bizId");
        JSONArray documentParams = object.getJSONArray("documentParams");
        List<DocumentParamDto> documentParamDtos = documentParams.toJavaList(DocumentParamDto.class);

        try {
            result = contractLockService.fillParams(Long.valueOf(contractId),bizId,documentParamDtos);
        }catch (Exception e) {
            e.printStackTrace();
            result.error500(e.getMessage());
        }
        return result;
    }

对于list对象,使用了aibaba的getJSONArray接收后,再toJavaList解析;

  1. 使用map:
@PostMapping("/contract/fillParams")
    public Result<String> fillParams(@RequestBody Map<String,Object> map){
        Result<String> result = new Result<>();
        String contractId = map.get("contractId").toString();
        Object documentParams = map.get("documentParams");
        List<DocumentParamDto> documentParamDtos = JSON.parseArray(JSON.toJSONString(documentParams), DocumentParamDto.class);

        return result;
    }

对于list对象,这里用Object 接收,然后是对Object 转为JSONString,然后再转为List

  1. 使用hutool工具:
JSONObject object = JSONObject.parseObject(execute);
        String result1 = object.getString("result");

        if (ResponseCodeEnum.SUCCESS.getCode()
                .equals(Integer.parseInt(object.getString("code")))){
            result.setCode(200);
            JSONArray jsonArray = JSONUtil.parseArray(result1);
            result.setResult(JSONUtil.toList(jsonArray, TemplateEntity.class));
            result.setMessage(object.getString("message"));
            return result;
        }

这里是用String接收,然后转JSONArray ,再转为List;

  1. 正常情况下是@RequestBody +实体来接收,比如:
@PostMapping("/template/insert")
    public Result<String> insertTemplateList(@RequestBody TemplateEntity templateEntity){
        Result<String> result = new Result<>();
        if (NullUtil.isEmpty(templateEntity)){
            result.error500("传入参数为空!");
            return result;
        }
        try {
            contractLockService.insertTemplateList(templateEntity);
        }catch (Exception e) {
            e.printStackTrace();
            result.error500("插入异常!");
            return result;
        }
        return null;
    }

补充:

对于form-data的类型:
在这里插入图片描述
后端有两种接收方式:

  1. @RequestParam的方式
@PostMapping("/contract/send")
    public Result<String> sendContract(@RequestParam("contractId")String contractId,
                                       @RequestParam("bizId")String bizId){
        Result<String> result = new Result<>();

        try {
            result = contractLockService.sendContract(Long.valueOf(contractId),bizId);
        }catch (Exception e) {
            e.printStackTrace();
            result.error500(e.getMessage());
        }
        return result;
    }
  1. 直接使用实体
 @PostMapping("/contract/send")
    public Result<String> sendContract(ContractDto contractDto){
        Result<String> result = new Result<>();

        try {
            result = contractLockService.sendContract(Long.valueOf(contractId),bizId);
        }catch (Exception e) {
            e.printStackTrace();
            result.error500(e.getMessage());
        }
        return result;
    }

因为form-data的方式就是键值对的方式;
另外application/x-www-form-urlencoded的格式也是直接使用实体:
在这里插入图片描述

@PostMapping("/received")
    public Result<String> signatureCallback(SignatureInfoDto signatureInfoDto){
        Result<String> result = new Result<>();
        if (NullUtil.isEmpty(signatureInfoDto)){
            result.setCode(1000001);
            result.setMessage("传入参数为空!");
            result.setSuccess(false);
            return result;
        }
        return result;
    }
<think>嗯,用户想在后端处理和获取多层嵌套的JSON数据,这确实是个常见的问题。我需要先确定他们使用的编程语言,比如Python或者Java,因为不同语言的解析方法可能不同。不过用户提到了后端,可能涉及到多种语言,所以最好涵盖主要的两种。 首先,我得回忆一下如何处理多层嵌套的JSON。比如在Python中,可以使用json模块和jsonpath-ng库。json模块可以解析成字典,但嵌套深的话需要逐层访问,比较麻烦。这时候jsonpath-ng就派上用场了,它可以通过路径表达式直接提取数据。比如用户想获取第三层的数据,可以用类似$.data.user.address.city这样的表达式。不过要记得安装这个库,用户可能需要提示安装步骤。 然后是Java的情况,Java通常用Jackson或者Gson库。Jackson的ObjectMapper可以反序列化JSON到Map或者自定义对象,如果是动态处理,用TypeReference来获取嵌套结构。另外,JsonNode树形结构也能逐层解析,比如通过get("data").get("user")这样的链式调用。同样,使用这些库需要添加依赖,用户可能需要检查项目配置。 还要注意用户可能的深层嵌套问题,比如不确定结构或者动态路径,这时候jsonpath在两种语言中都是好选择。Python的jsonpath-ng和Java的Jayway JsonPath都是常用的工具。示例代码需要展示这两种情况,让用户清楚如何应用。 另外,用户可能遇到的性能问题或者异常处理,比如JSON格式错误、路径不存在等情况。虽然用户没有直接提到,但作为最佳实践,应该提醒他们进行异常捕获,比如在Python中用try-except,Java中用try-catch块。不过用户的问题主要聚焦在解析方法,所以这部分可以简要提及。 还要参考用户提供的引用资料,引用1和3提到了Python的jsonpath,引用2和4是Java的处理方法。需要将这些引用自然地融入回答中,比如在Python部分引用1和3,Java部分引用2和4。确保每个示例后都有对应的引用标注,帮助用户追溯来源。 最后,生成的相关问题要围绕用户的需求扩展,比如性能优化、复杂结构处理、不同语言对比等,这样用户如果有进一步的问题,可以参考这些方向。同时,保持回答结构清晰,分步骤说明,让用户能一步步跟随操作。</think>### 后端解析多层嵌套 JSON 数据的方法及示例 #### 1. **Python 解析方法** **核心工具**:`json` 模块 + `jsonpath-ng` 库(支持类似 XPath 的语法提取嵌套数据) **步骤**: 1. 安装依赖:`pip install jsonpath-ng` 2. 解析并提取数据示例: ```python import json from jsonpath_ng import parse # 原始多层嵌套 JSON data = { "user": { "id": 101, "profile": {"name": "Alice", "address": {"city": "Shanghai"}} } } # 使用 jsonpath 提取嵌套字段 jsonpath_expr = parse("$.user.profile.address.city") matches = [match.value for match in jsonpath_expr.find(data)] print(matches) # 输出:['Shanghai'] ``` **关键点**:通过 `$.a.b.c` 路径语法直接定位深层字段[^3]。 --- #### 2. **Java 解析方法** **核心工具**:`Jackson` 或 `Gson` 库(推荐 Jackson,性能更优) **步骤**: 1. 使用 `ObjectMapper` 解析为 `Map` 或自定义对象 2. 动态提取嵌套数据示例: ```java import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.core.type.TypeReference; // 多层 JSON 字符串 String jsonStr = "{\"data\":{\"user\":{\"id\":101,\"tags\":[\"backend\",\"java\"]}}}"; ObjectMapper mapper = new ObjectMapper(); Map<String, Object> map = mapper.readValue(jsonStr, new TypeReference<Map<String, Object>>() {}); // 逐层提取嵌套数据 Map<String, Object> data = (Map<String, Object>) map.get("data"); Map<String, Object> user = (Map<String, Object>) data.get("user"); List<String> tags = (List<String>) user.get("tags"); System.out.println(tags); // 输出:[backend, java] ``` **关键点**:通过 `TypeReference` 处理泛型嵌套结构,逐层类型转换[^4]。 --- #### 3. **通用优化技巧** - **动态路径处理**:若字段路径不确定,可通过字符串拼接生成路径(如 Java 的 `JsonNode` 或 Python 的 `jsonpath` 动态解析) - **异常捕获**:对 `NullPointerException`(Java)或 `KeyError`(Python)做容错处理 - **性能优化**:对频繁解析的 JSON 结构可预定义 `POJO` 类(Java)或 `dataclass`(Python)提升反序列化效率 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值