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

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

时间:2024-08-15 17:58:04浏览次数:14  
标签:调用 转化成 JsonArray JSONUtil 接口 对象 解析 data String

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

其实调用三方接口分为几步
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类型直



}

标签:调用,转化成,JsonArray,JSONUtil,接口,对象,解析,data,String
From: https://blog.csdn.net/qq_39666711/article/details/141224782

相关文章

  • C语言中的操作符:深入解析与应用
    引言C语言提供了丰富的操作符,用于执行算术运算、逻辑判断、位操作等。这些操作符是编程语言中的基础构件,它们使得程序能够进行复杂的数据处理和逻辑控制。本文将详细介绍C语言中的各种操作符,包括它们的类型、用法和一些实际应用示例。操作符的分类算术操作符算术操作符用于......
  • Windows通过dynv6提供免费的IPv6动态域名解析(DDNS)服务(注册服务的方式运行)
    Dynv6IPv6Updater项目简介特性使用方法环境依赖运行脚本参数说明示例日志输出Windows服务注册步骤1:下载并安装NSSM步骤2:准备Python环境和脚本步骤3:使用NSSM注册服务步骤4:启动服务并验证步骤5:设置日志记录(可选)步骤6:重启系统并验证附:以下为帮......
  • 基于Nexus实现配置阿里云代理仓库过程解析
    基于Nexus实现配置阿里云代理仓库过程解析更新时间:2020年07月09日09:19:07  作者:咔咔kk 这篇文章主要介绍了基于Nexus实现配置阿里云代理仓库过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下Nexus默认远程仓......
  • ThreadLocal源码解析
    ThreadLocal有内部类ThreadLocalMap,ThreadLocalMap是ThreadLocal的核心1.每个线程下的有一个ThreadLocalMapstaticclassThreadLocalMap{staticclassEntryextendsWeakReference<ThreadLocal<?>>{Objectvalue;Entry(ThreadLocal<?>k,Ob......
  • 探索Gradle:现代化构建工具的深入解析
    目录引言Gradle简介Gradle的安装与配置Gradle的基础概念项目与任务构建脚本依赖管理Gradle构建生命周期初始化阶段配置阶段执行阶段常用Gradle命令Gradle与Maven的对比Gradle插件常见插件自定义插件Gradle的高级特性多项目构建构建缓存持续集成Gradle最佳实践总结......
  • 大模型面试题库精华:100道经典问题解析
    ↓推荐关注↓算法暑期实习机会快结束了,校招大考即将来袭。当前就业环境已不再是那个双向奔赴时代了。求职者在变多,岗位在变少,要求还更高了。最近,我们陆续整理了很多大厂的面试题,帮助网友解惑答疑和职业规划,分享了面试中的那些弯弯绕绕。喜欢本文记得收藏、关注、点赞,更......
  • 深入解析SVG 标签的 viewBox属性(超详细)
    解析SVG标签的viewBox属性案情提要相信小伙伴们在学习svg标签的viewBox属性时候,无论是看w3cschool还是MDN的官方文档,都是一头雾水。比如MDN给出的解释:viewBox属性允许指定一个给定的一组图形伸展以适应特定的容器元素。viewBox属性的值是一个包含4个参数的列表......
  • 植入式可编程微型电流刺激器解决方案之软件架构解析
    前记 微电流刺激仪,是指利用低强度特定波形电流刺激大脑、下丘脑、边缘网状结构,调节大脑兴奋性,治疗失眠、焦虑或缓解症状。随着近些年新的医疗方式和科学研究的不断深入。这类技术在生物学以及医疗健康领域变得愈加重要了。笔者团队有幸参与了国内一家科研项目,并把该设备做成实......
  • 深入解析Spring Boot中的@ConfigurationProperties注解
    深入解析SpringBoot中的@ConfigurationProperties注解在SpringBoot框架中,配置管理是一个核心功能。SpringBoot提供了多种方式来处理外部配置,其中@ConfigurationProperties注解是一个非常强大且灵活的工具。本文将深入探讨@ConfigurationProperties注解的概念、用法、工......
  • 深入解析Spring MVC中静态资源的放行配置
    深入解析SpringMVC中静态资源的放行配置在现代Web应用开发中,静态资源的处理是一个重要环节。静态资源包括HTML、CSS、JavaScript、图片等文件,它们不需要服务器进行动态处理,直接由客户端浏览器请求并渲染。SpringMVC提供了多种方式来配置和管理静态资源,确保这些资源能够被......