• 通俗易懂介绍如何组装json字符串


    背景

        平常的开发工作中经常会接触第三方接口,需要按照第三方规定的参数格式进行参数组装完成接口调用.对于请求方式为Get类型的接口来说,所有的参数直接在请求路径后面进行拼接即可.但是对于请求参数需要组装在请求体中的接口,类似组装下面json格式数据:

    {
        "appid" : "wxf636efh567hg4356",
        "out_batch_no" : "plfk2020042013",
        "batch_name" : "2019年1月深圳分部报销单",
        "batch_remark" : "2019年1月深圳分部报销单",
        "total_amount" : 4000000,
        "total_num" : 200,
        "transfer_detail_list" : [
          {
            "out_detail_no" : "x23zy545Bd5436",
                "transfer_amount" : 200000,
            "transfer_remark" : "2020年4月报销",
            "openid" : "o-MYE42l80oelYMDE34nYD456Xoy"
          }
        ]
      }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

        组装类似上面json格式字符串可以说是经常碰到的需求,本文就以上面示例为例,讲述两种不同的组装方式.

    1.封装对象

        平常开发中对于接口需要传递多个参数的请求(Get除外),最常用的方式就是使用将请求参数封装成一个对象,没错这里可以按照对象封装的形式进行封装.根据上面的参数示例可以看出参数存在两级关系,下面封装两个实体类.
        外层实体类:

    @ApiModel("转账请求参数")
    @Data
    public class TransferDto implements Serializable {
        private static final long serialVersionUID = -2201251153238623832L;
    
        @ApiModelProperty(value = "直连商户的appid",example = "wxf636efh567hg4356",dataType = "String")
        private String appid;
    
        @ApiModelProperty(value = "商家批次单号",example = "plfk2020042013",dataType = "String")
        private String out_batch_no;
    
        @ApiModelProperty(value = "批次名称",example = "2019年1月深圳分部报销单",dataType = "String")
        private String batch_name;
    
        @ApiModelProperty(value = "批次备注",example = "2019年1月深圳分部报销单",dataType = "String")
        private String batch_remark;
    
        @ApiModelProperty(value = "转账总金额,单位分",example = "1",dataType = "Integer")
        private Integer total_amount;
    
        @ApiModelProperty(value = "转账总笔数",example = "1",dataType = "Integer")
        private Integer total_num;
    
        @ApiModelProperty(value = "转账明细列表",dataType = "list.class")
        private List<TransferDetailDto> transfer_detail_list=new ArrayList<>();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

        内层实体类:

    @ApiModel("转账请求详情参数")
    @Data
    public class TransferDetailDto implements Serializable {
        private static final long serialVersionUID = -4087771376135651941L;
    
        @ApiModelProperty(value = "商家明细单号(相当于子订单)",example = "x23zy545Bd5436",dataType = "String")
        private String out_detail_no;
    
        @ApiModelProperty(value = "转账金额,单位分",example = "2",dataType = "Integer")
        private Integer transfer_amount;
    
        @ApiModelProperty(value = "转账备注",example = "2020年4月报销",dataType = "String")
        private String transfer_remark;
    
        @ApiModelProperty(value = "用户在直连商户应用下的用户标示",example = "2019年1月深圳分部报销单",dataType = "String")
        private String openid;
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

        创建好实体类开始创建对象进行组装并将对象转化为json字符串:

    TransferDto transferDto = new TransferDto();
            transferDto.setAppid("wxf636efh567hg4356");
            transferDto.setOut_batch_no("plfk2020042013");
            transferDto.setBatch_name("2019年1月深圳分部报销单");
            transferDto.setBatch_remark("2019年1月深圳分部报销单");
            transferDto.setTotal_amount(4000);
            transferDto.setTotal_num(200);
            TransferDetailDto transferDetailDto = new TransferDetailDto();
            transferDetailDto.setOut_detail_no("x23zy545Bd5436");
            transferDetailDto.setTransfer_amount(200000);
            transferDetailDto.setTransfer_remark("2020年4月报销");
            transferDetailDto.setOpenid("o-MYE42l80oelYMDE34nYD456Xoy");
            transferDto.getTransfer_detail_list().add(transferDetailDto);
            String transferDtoStr = JSONUtil.toJsonStr(transferDto);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

        下面以post请求为例,介绍如何进行发送请求(使用hutool中HttpRequest):

    String returnMsg = HttpRequest.post(Constants.TRANSFER_ACCOUNT_URL)
    				// 请求中如果要求传递指定请求头信息此处可进行指定
                    .header("自定义请求头", "自定义请求头信息")
                    .body(transferDtoStr,"application/json")
                    .execute().body();
    
    • 1
    • 2
    • 3
    • 4
    • 5

        hutool工具类的依赖

      <dependency>
                <groupId>cn.hutool</groupId>
                <artifactId>hutool-all</artifactId>
                <version>5.5.2</version>
            </dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

        使用对象组装的方式比较符合平常的开发习惯,但是存在一个问题就是过于"笨重",毕竟需要创建实体类并进行实例化赋值.有没有更简便的方式,答案是肯定有的,继续往下看!

    2.组装map并转化为json

        json格式key-value的形式与map结构相似,可以组装成map转化为json(实现方式有多种,本文以hutool中的parse方法进行实现).自定义map中key的数据类型一定为字符串,但是value的数据类型不一定是字符串,所以可以定义为object类型,可以适配字符串、integer以及示例中transfer_detail_list的list集合类型,transfer_detail_list集合中的元素类型又是map类型.按照以上思路进行整理之后就有了下面的实现:

     HashMap<String, Object> transferMap = new HashMap<>();
            transferMap.put("appid","wxf636efh567hg4356");
            transferMap.put("out_batch_no","plfk2020042013");
            transferMap.put("batch_name","2019年1月深圳分部报销单");
            transferMap.put("batch_remark","2019年1月深圳分部报销单");
            transferMap.put("total_amount",4000000);
            transferMap.put("total_num",200);
            ArrayList<Map> transferDetailList = new ArrayList<>();
            HashMap<String, Object> transferDetail = new HashMap<>();
            transferDetail.put("out_detail_no","x23zy545Bd5436");
            transferDetail.put("transfer_amount",200000);
            transferDetail.put("transfer_remark","2020年4月报销");
            transferDetail.put("openid","o-MYE42l80oelYMDE34nYD456Xoy");
            transferDetailList.add(transferDetail);
            transferMap.put("transfer_detail_list",transferDetailList);
            // 将map转化为json
            JSON parse = JSONUtil.parse(transferMap);
            // json对象转化为json字符串
            String transferDtoStr = JSONUtil.toJsonStr(parse);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    3.补充另外几种简单的方式

        json要实现的json字符串:

    {"openId":"123","receiveUserId":456,"newsType":1}
    
    • 1

        直接拼接

    		 String a="123";
            Integer b=456;
            String jsonStr = "{\"openId\":\""+a+"\",\"receiveUserId\":"+b+",\"newsType\":1}";
            System.out.println(jsonStr);
    
    • 1
    • 2
    • 3
    • 4

        使用StringBuilder拼接:

    StringBuilder stringBuilder = new StringBuilder();
            stringBuilder.append("{")
                    .append("\"openId\"")
                    .append(":")
                    // 注意字符串双引号需要进行转义对应:双引号对应转义符为\"
                    .append("\"")
                    .append(a)
                    .append("\"")
                    .append(",")
                    .append("\"receiveUserId\"")
                    .append(":")
                    .append(b)
                    .append(",")
                    .append("\"newsType\"")
                    .append(":")
                    .append(1)
                    .append("}");
            String string = stringBuilder.toString();
            System.out.println(string);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

        以上就是关于json字符串参数组装的几种实现方式,看到这里如果感觉有所收获欢迎点赞,如果还有其他的实现方式可以评论区留言相互学习!

  • 相关阅读:
    Spring Framework RCE 漏洞分析 (CVE-2022-22965)
    Java面试题,面试题,CAS,CAS原理
    让Python可视化事半功倍!
    【电子电路】简易电子负载
    web之vue+vue-router+jquery 以传统模式开发单页面应用
    移动端游戏软件开发:从创意到发布的全过程
    多线程---JUC
    3主3从redis集群扩缩容配置案例说明
    Windows多线程编程
    我们来用Unity做一个局域网游戏(下)
  • 原文地址:https://blog.csdn.net/weixin_43401380/article/details/128045138