通俗易懂介绍如何组装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"
      }
    ]
  }


   组装类似上面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<>();
}


   内层实体类:

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


   创建好实体类开始创建对象进行组装并将对象转化为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);


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


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


   hutool工具类的依赖

<dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.5.2</version>
        </dependency>


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


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


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


相关文章
|
4月前
|
JSON JavaScript 前端开发
JavaScript实现字符串转json对象的方法
JavaScript实现字符串转json对象的方法
|
3月前
|
XML JSON 前端开发
json字符串CSS格式化
完成以上步骤后,你便能在网页中看到格式化后的JSON数据,它们将按照CSS定义的样式进行展示,使数据更易于阅读和理解。通过有效地结合JSON和CSS,你可以创建出更加丰富且易于交互的网页内容。
212 64
|
2月前
|
JSON 前端开发 JavaScript
json字符串如何转为list对象?
json字符串如何转为list对象?
345 7
|
3月前
|
XML JSON 前端开发
json字符串CSS格式化
json字符串CSS格式化
71 4
|
3月前
|
JSON 数据格式 Python
6-1|Python如何将json转化为字符串写到文件内 还保留json格式
6-1|Python如何将json转化为字符串写到文件内 还保留json格式
|
4月前
|
JSON Java 数据格式
Java系列之:生成JSON字符串
这篇文章介绍了两种在Java中生成JSON字符串的方法:使用`JSONObject`类及其`toJSONString`方法来动态生成,以及手动拼接字符串的方式来创建JSON格式的字符串。
Java系列之:生成JSON字符串
|
4月前
|
JSON Go 数据格式
Go实现json字符串与各类struct相互转换
文章通过Go语言示例代码详细演示了如何实现JSON字符串与各类struct之间的相互转换,包括结构体对象生成JSON字符串和JSON字符串映射到struct对象的过程。
37 0
|
6月前
|
JSON JavaScript 前端开发
js将json字符串还原为json
【6月更文挑战第15天】js将json字符串还原为json
54 4
|
5月前
|
存储 JSON Java
Java对象转换为JSON字符串
在Java开发中,常需将数据对象转换为JSON存储,如使用Fastjson库。要将Java对象转为JSON,可调用`JSON.toJSONString(obj)`;反向转换则用`JSON.parseObject(str, Class)`。
|
5月前
|
JSON 数据格式
Unsupported Media Type,传入的字符串数据:这里应该是Json
Unsupported Media Type,传入的字符串数据:这里应该是Json
下一篇
DataWorks