JSONUtil、JsonArray应用 (全网最全面的解析方式汇总) - 调用第三方接口后,获取的结果如何转化成对象,转化成对象之后又如何解析

原文链接:JSONUtil、JsonArray应用 (全网最全面的解析方式汇总) - 调用第三方接口后,获取的结果如何转化成对象,转化成对象之后又如何解析

背景:近期开发的内容涉及到了我们平台对其他平台提供接口的调用,然后也涉及到接口提供方的验签等操作;还有我们的加签操作等。
今天记录一下调用三方接口后返回的接口如何解析;怎么拿到自己想要的东西。

其实调用三方接口分为几步
1、采用哪种方式调用三方接口,这种依赖于第三方系统是提供了什么样的接口,目前我了解的到的接口有http接口还有dubbo接口等。
如果是http接口的话,可以看我的另外一篇文章 ,多方式调用三方接口 本篇文章很详细的总结了多种调用三方接口的API方法,并且包含post、get等不同方式的请求;
对于dubbo接口如何调用,我初步理解为 我们将提供服务的jar包依赖放到pom.xml中,并在相关类中通过dubbo注解引入即可。如下图
在这里插入图片描述
对于dubbo接口的调用,我后面也会出一篇博客~

开始今天的正文:

现在有一个这样的调用:
在这里插入图片描述

其中有一些内容可以看我的博客

token鉴权相关文章提供三方API接口、调用第三方接口API接口、模拟API接口(二)通过token实现防止业务接口的重复调用

sign签名相关文章提供三方API接口、调用第三方接口API接口、模拟API接口(一)通过signature签名验证,避免参数恶意修改

自己假设一个情景,我需要调用用户系统的接口通过自己传输的参数 去获得员工员工绩效、员工职级、员工部门等信息。 我们一起实现这一个简单的调用,其他的就能举一反三了 ☺

入参的构建方式

MyReqDemo.class 一共三个属性 ,姓名 性别 年龄,


public class  MyReqDemo{
		private String name; 
		private String sex;
		private Integer age;
}

响应参数的解析方式

先建一个接收响应参数中实体属性的对象 MyResDemo.class 一共三个属性,


public class  MyResDemo{
		private String saleNumber;   //员工绩效
		private String zclass;   //员工职级
		private String departName;   //员工部门
}

例如我们现在在yml或者nacos中配置的
ip :http://test.com.cn
url: /user/getUserInfo

对方接口提供的是post请求,我们需要把员工姓名、年龄、性别传输到这个用户系统的这个接口中,查询 绩效、部门等信息

//构造入参:
MyReqDemo  reqDemo = new MyReqDemo();
reqDemo.setName("张三");
reqDemo.setAge(19);
//将对象转化成JsonObject  
JsonObject  jsonObject = JSONUtil.parseObj(reqDemo);
jsonObject.put("yyy","yyyyy")//这步可以没有,这里是如果reqDemo中没有的属性想要传过去,可以在这里加上一个键值对,然后再下面传的时候,再toString
//发送请求
String res = httpRequest.post("http://test.com.cn")
           .header("satoken","afsdfdsfwefsdfwefxdfwefsa")
           .header("apiKey",apiKey)
           .body(jsonObject .toString())
           .excute();

log.info("响应结果:{}",res);

//将字符串转化成JsonObject  
JsonObject  jsonResult = JSONUtil.parseObj(res );  //!!!!哈哈这里也用到这个方法了,上面也用到了,所以这个parseObj()可以接受Object类型对象参数,也可以接收String参数,将这两者转化成JSONObject对象。这个JSONObject对象可以通过键值对和层级来取出其中的属性对应的值。

//解析响应参数: 特别注意这里是按照下面提供的接口文章中的响应示例来解析的(一般第三方提供接口之前会给一个接口文章,这样双方可以同步开发)
Boolean reqQes =jsonResult.getBool("success");
if(Boolean.TRUE.equals(reqQes )){
//解析里面的数据
String data = jsonResult.getStr("data");
JsonObject  newJsonObject =JSONUtil.parseObj(data);//这里data是String类型
JsonArray jsonArray = newJsonObject. getJsonArray("list");//这里就拿到了响应结果中的list数组了。  JsonArray不是正常的List,我们无法直接使用,我们需要将他转化成List类型,怎么转化呢,接着来看
List<MyResDemo> MyResDemoList =JSONUtil.toList(jsonArray ,MyResDemo.class); //至此我们就拿到了其中List中真正的业务数据了。
}else{
log.info("响应失败,失败信息:{}",res);
}

比如对方提供的接口文档中 响应参数的结构如下:

{
    "success": true,
    "err": null,
    "msg": null,
    "data": {
        "list": [
            {
                "saleNumber": "1000",
                "zclass": "5",
                "departName": "XX超市1部",
       
            },
            {
                "saleNumber": "20000",
                "zclass": "10",
                "departName": "XX超市2部",
            
            }
        ],
        "total": 2,  //总记录数
        "UserNumber": 2,  //用户数量
        "totalSale": 21000,  //销售总额
    }
}

注意我这里的解析

//解析响应参数: 特别注意这里是按照下面提供的接口文章中的响应示例来解析的(一般第三方提供接口之前会给一个接口文章,这样双方可以同步开发)
Boolean reqQes =jsonResult.getBool("success");
if(Boolean.TRUE.equals(reqQes )){
//解析里面的数据
String data = jsonResult.getStr("data");
JsonObject  newJsonObject =JSONUtil.parseObj(data);//这里data是String类型
JsonArray jsonArray = newJsonObject. getJsonArray("list");//这里就拿到了响应结果中的list数组了。  JsonArray不是正常的List,我们无法直接使用,我们需要将他转化成List类型,怎么转化呢,接着来看
List<MyResDemo> MyResDemoList =JSONUtil.toList(jsonArray ,MyResDemo.class); //至此我们就拿到了其中List中真正的业务数据了。
}else{
log.info("响应失败,失败信息:{}",res);
}

我这里是先把解析出来的字符串类型的data 转化成了JSONObject对象,然后通过这个对象中取 下面的list属性,因为list属性对应的结构是[{“name”:“222”},{“name”:“111”},{“name”:“333”}] 这种结构,通过 newJsonObject. getJsonArray(“list”);方法就能拿到JsonArray对象,之后再把这个对象转化成对象的List就能使用了。

当然最后获取的业务数据是数组时,这是一种解析的方式,对于最后业务数据是数组来说, 还有另外一种方式:

//如果响应的业务数据提取出来之后是String类型的话
String jsonString = “”;//业务数据,json类型的字符串

JSONArray jsonArray = JSONArray.parseArray(jsonString);

for(int i=0; i<jsonArray.size(); i++) {
JSONObject object = jsonArray.getJSONObject(i);  //通过这种也可以取出来JsonArray中的每一个JSONObject对象,然后再一个一个转化成Res实体对象也行。这也是一种方法。
SmartProejctEquipmentMap myclass = JSONObject.parseObject(object.toJSONString() , SmartProejctEquipmentMap.class);// 将string类型直接封装成对象
}

这两种方式都是对于
响应结构
“data”: {
“list”: [
{
“saleNumber”: “1000”,
“zclass”: “5”,
“departName”: “XX超市1部”,

        },
        {
            "saleNumber": "20000",
            "zclass": "10",
            "departName": "XX超市2部",
        
        }
    ],
    "total": 2,  //总记录数
    "UserNumber": 2,  //用户数量
    "totalSale": 21000,  //销售总额
}

这种data中是对象,对象中的属性是一个数组的,这样取

如果data是一个对象,对象中的属性是age、name这样的,不是一个数组的话。通过下面的这种方式解析:

JsonObject  jsonResult = JSONUtil.parseObj(res ); 
String data =jsonResult .getStr("data");
MyResDemo  myResDemo= JSONObject.parseObject(jsonString,MyResDemo .class);

总结:此文章中系统熟悉了
JSONUtil工具中的几个方法:

// //例如上文中 响应结果中res的处理
 JsonObject  jsonResult  =JSONUtil.parseObj(字符串) 
 //构建入参时,对象到JSONObject对象的转换
 JsonObject  jsonObject  =  JSONUtil.parseObj(对象)  
 // 将JsonArray转换成对象List
 List<MyResDemo> MyResDemoList =JSONUtil.toList(jsonArray ,MyResDemo.class); 

JSONArray的工具方法

//jsonString的结构是数组类型,则通过下面方法转化成JsonArray对象
JSONArray jsonArray = JSONArray.parseArray(jsonString);

还有JsonObject对象可以调用的方法:

//第一种:res是String类型的,对String类型的参数如何以String类型取出来其中的一个属性
JsonObject  jsonResult = JSONUtil.parseObj(res ); 
String data =jsonResult .getStr("data"); //以String类型取出来data属性


//第二种: //这个可以看上面的例子,先以字符串形式取出其中的一个属性,然后再调用JSONUtil.parseObj(data) 获取到JsonObject  对象,然后就能调用getJsonArray("属性名") 
String data = jsonResult.getStr("data"); 
JsonObject  newJsonObject =JSONUtil.parseObj(data);//这里data是String类型
JsonArray jsonArray = newJsonObject. getJsonArray("list");//这里就拿到了响应结果中的list数组了。  JsonArray不是正常的List,我们无法直接

JsonArray对象可以调用的方法:

//第一种: 
//如果响应的业务数据提取出来之后是String类型的话
String jsonString = “”;//业务数据,json类型的字符串
JSONArray jsonArray = JSONArray.parseArray(jsonString);
for(int i=0; i<jsonArray.size(); i++) {
JSONObject object = jsonArray.getJSONObject(i);  //通过这种也可以取出来JsonArray中的每一个JSONObject对象,然后再一个一个转化成Res实体对象也行。这也是一种方法。
SmartProejctEquipmentMap myclass = JSONObject.parseObject(object.toJSONString() , SmartProejctEquipmentMap.class);// 将string类型直



}
使用Hutool库发送HTTP请求的步骤如下: 1. 添加Hutool的依赖到你的项目中。你可以通过Maven或Gradle等依赖管理工具来添加依赖。 2. 导入相关的类:在Java类中,你需要导入Hutool的HttpUtil类。可以使用以下代码来导入: ```java import cn.hutool.http.HttpUtil; ``` 3. 发送HTTP请求:你可以使用HttpUtil类的get、post、put、delete等方法来发送HTTP请求。例如,发送一个GET请求,你可以使用以下代码: ```java String result = HttpUtil.get("http://www.example.com/api"); ``` 这将发送一个GET请求到http://www.example.com/api并返回响应结果。你可以使用post、put、delete等方法来发送其他类型的请求。 4. 添加请求参数:如果你需要向请求中添加参数,可以使用HttpUtil类的其他方法。例如,如果你需要向POST请求中添加参数,可以使用以下代码: ```java HashMap<String, Object> paramMap = new HashMap<>(); paramMap.put("username", "testuser"); paramMap.put("password", "testpass"); String result = HttpUtil.post("http://www.example.com/api", paramMap); ``` 这将向http://www.example.com/api发送一个POST请求,并在请求中包含参数"username"和"password"。 5. 处理响应结果:你可以使用HttpUtil类返回的字符串来处理响应结果。你可以将其转换为JSON对象、XML对象等。例如,你可以使用以下代码将响应结果转换为JSON对象: ```java JSONObject json = JSONUtil.parseObj(result); ``` 这将把响应结果解析JSON对象,你可以使用该对象来处理响应数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

执键行天涯

码你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值