springboot 使用内部类接收复杂的json结构 | 多层嵌套JSON类型的解析

springboot 使用内部类接收复杂的json结构

背景 最近接到一个需求,是对上传的json文件进行解析,上传的json文件,里面内容结构比较复杂,即一个实体引用另一个实体,需要定义很多的实体去接收,实体太多,做法不是很优雅。这里使用内部类的写法去接收复杂的json数据结构,内部类里面还能嵌套内部类,不管多复杂,一个实体都可以搞定。

JSON文件内容结构如下图:

JSON文件内容结构

定义实体

public class Demo {

    private String name;

    private RequestObj request;

    private List<Object> response;

    /**
     * 此处省略 getter 、setter 和toString
     *
     * @return
     */

    // 定义内部类
    public static class RequestObj {
        private String method;

        private List<RequestHeader> header;

        private RequestUrl url;

        private RequestBody body;

        /**
         * 此处省略 getter 和setter
         */
        // 嵌套 定义内部类
        public static class RequestHeader {
            /**
             * 代码省略
             */
        }

        // 嵌套 定义内部类
        public static class RequestUrl {
            /**
             * 代码省略
             */
        }

        // 嵌套 定义内部类
        public static class RequestBody {
            /**
             * 代码省略
             */
        }

    }
}

Controller 层

这篇文章是demo示例,就不写service层那些了。直接用controller层接收上传的json文件,并进行解析,代码如下。

    /**
     * 上传JSON数据 并解析
     *
     * @param file
     * @return
     */
    @PostMapping(value = "/uploadJson", produces = "application/json;charset=UTF-8")
    public CommonResp uploadPostmanFileFromJson(@RequestParam(value = "file") MultipartFile mappingFile) {

        InputStream is = null;
        BufferedReader br = null;
        StringBuffer sb = new StringBuffer();
        String str = null;
        try {
            is = mappingFile.getInputStream();
            br = new BufferedReader(new InputStreamReader(is));
            while ((str = br.readLine()) != null) {
                sb.append(str);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                br.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
		// 将数据转成json类型
        JSONObject jsonObject = JSONObject.parseObject(sb.toString());
        // 取出item对象,组装json数组
        JSONArray jsonArray = jsonObject.getJSONArray("item");
		// 将json数组转成List形式
        List<Demo> requestItems = JSONObject.parseArray(jsonArray.toJSONString(), Demo.class);

        CommonResp resp = new CommonResp();
        resp.setContent(requestItems);
        return resp;
    }

使用postman进行测试

CommonResp 是定义的返回实体,就不贴代码了。
在这里插入图片描述

在基于SpringBootjava后端中,对应的数据库是MySQL。现在需要开发一个功能。 已经知晓,从第三方系统中传过来了一个Json,保存在了数据库的表A中 需要从表B中取出已经添加好的Json标准模板。然后再将第三方系统的JsonJson标准模板进行比较。 需要校验第三方Json结构,以及在模板中必填的项,必填项标志为:"^",需要校验是否填写了。同时在表B中要设计一个存储可能存在多个子集的项的字段。存储的项会用英文逗号分隔。 我解释一下什么是可能存在多个子集的项。比如说"凭证明细"是可能存在多个子集的项。 那传过来的第三方系统的Json的"凭证明细"部分可能是以下这样的: "凭证明细": [{ "电子文件号": "1020_2025_0100001587", "行号": "002", "摘要": "BXD202501170-报差旅费-160377|陆文兵", "分配": "00052444", "记账码": "40", "总账科目代码": "2221010138", "总账科目": "应交税费-应交增值税-进项税额-客运服务-非专票", "借方": "11.56", "贷方": "0", "原币金额": "11.56" }, { "电子文件号": "1020_2025_0100001587", "行号": "005", "摘要": "BXD202501170-报差旅费-160377|陆文兵", "分配": "BXD202501170", "记账码": "40", "总账科目代码": "5301011700", "总账科目": "研发支出-费用化支出-差旅费", "借方": "240", "贷方": "0", "原币金额": "240" }], 子集里面的信息都是需要校验的。 综上所述,请问如何去设计实现这个功能呢? 以下给出一个标准模板进行参考,其中:"凭证明细"、"关联凭证"字段,是可能存在多个子集的项: { "文件实体块": { "文件实体": { "来源": { "全宗名称": "^", "立档单位名称": "^", "电子文件号": "^" }, "档号": { "全宗号": "^", "目录号": "", "年度": "^", "保管期限": "", "机构或问题": "", "类别号": "^", "室编案卷号": "", "室编件号": "", "文档序号": "", "页号": "" }, "内容描述": { "单据类型": "^", "单位": "^", "财务主体代码": "^", "销售合同号": "^", "责任者": "^", "期间": "^YYYY-MM", "过账日期": "^YYYY-MM-DD", "凭证编号": "^", "货币": "^", "汇率": "^", "凭证类型": "^", "凭证抬头文本": "^", "凭证明细": [{ "行号": "^", "摘要": "^", "总账科目": "^", "明细对象": "^", "借方": "^", "贷方": "^", "原币金额": "^" }], "附件": "^", "合计借方金额": "^", "合计贷方金额": "^", "财务主管": "^", "财务主管工号": "^", "复审模式": "^", "复核": "^", "复核工号": "^", "制单": "^", "制单工号": "^", "经办人": "^", "经办人工号": "^", "备注": "^", "关联凭证": [{ "公司代码": "^", "凭证类型": "^", "凭证号": "^" }], "关联业务单据": [{ "系统代码": "^", "业务单据号": "^" }],
最新发布
03-08
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值