解析JsonObject的数据结构(一)

2024-05-02 17:08

本文主要是介绍解析JsonObject的数据结构(一),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

       最近在对接一个第三方接口时碰到这样的一种数据结构,刚开始全部对接完成的时候,发现里面没有一丝嵌套,不需要采用数组啥的,心里还挺赞叹他们的接口,,结果,昨天领导说需要拿到里面的某个字段,计算后放回原地方。这才深刻体会到这种数据结构的难受之处。

       首先先上代码,会发现就是一个很平常的json结构。

{"rcode": "000000","desc": "请求成功","data": {"didi": {"estimate_price": {"favourable": false,"price": 36.9,"name": "普通型","memo": "","real_price": 36.9},"min_duration": {"has_car": true,"min_distance": 2298,"min_duration": 7}},"yidao": {"estimate_price": {"favourable": false,"price": 54,"name": "易达","memo": "","real_price": 54},"min_duration": {"has_car": false,"min_duration": 4}},"caocao": {"estimate_price": {"favourable": true,"price": 375.9,"name": "新能源","memo": "限时9.8折","real_price": 368.402},"min_duration": {"has_car": false,"min_duration": 8}}}
}

着眼望去,key--value,key--value......说实话,我刚开始是有点无从下手的,这种形式如果嵌套很多层,压根无法循环解析,因为里面永远有key存在,你怎么解析呢?

在这里提一下我需要实现的功能:拿出每一个供应商下的price字段,调用本地接口查询出手续费,将手续费加上去,最后塞回到相应的位置。

最终我的思路是这样的,首先遍历出所有的供应商key,由于只有供应商是不同的,里面的结构体是一样的。那么我就抽出所有不同供应商的结构体再做处理。

 //拿到data结构下的数据     JSONObject jsons = JSONObject.parseObject(res.getString("data"));List list = new ArrayList();//遍历data结构下的所有数据,这一点和map是一致的Set<Map.Entry<String, Object>> entries = jsons.entrySet();JSONObject o1 = new JSONObject();//循环遍历,有几个供应商就循环几次for (Map.Entry<String, Object> temp : entries) {//注意此处,我只拿出了当前循环中的value值,然后进一步拿出想要的estimate_price,//因为需要的字段就在这个结构体里面,放入到list集合中JSONObject o = (JSONObject) temp.getValue();o1 = JSONObject.parseObject(o.getString("estimate_price"));list.add(o1.getString("price"));log.info(o.toJSONString());}

最终你会拿到相应供应商的price字段下面的值。

这个时候已经拿出相应的price值,下一步请求本地接口查询手续费,这里是我本地的事情,我就基本略过。不过我这里接口拿到的值是key,key,key,的形式。所以也间接加强了后面塞值的难度。

 //拿到相应参数去获取手续费StringBuilder builder = new StringBuilder();//此处采用stringbuilder是为了避免循环只拿到一个值for (int i = 0; i < list.size(); i++) {builder.append(list.get(i) + ",");}//本地为key,key,的形式,处理最后一个逗号String amount = builder.substring(0, builder.length() - 1);String urls = baseServer + "query/fee";Map<String, Object> maps = new HashMap<>();maps.put("customNo", customerNo);maps.put("orderType", ApiConstants.CommonOrderType.ORDER_TYPE_FUEL_CARD_CAOCAO);maps.put("amount", amount);JSONObject json = JSONObject.parseObject(post(urls, maps));JSONObject addjson = JSONObject.parseObject(json.getString("data"));String prices = addjson.getString("fee");//返回相应的手续费,用逗号隔开,所以在这里就需要解析掉逗号String[] strs = prices.split(",");//这里的jsons代表的就是之前的data结构体,只不过此处我遍历的是key,而不是所有数据Set<String> keyset = jsons.keySet();//声明一个迭代器去迭代里面的数据Iterator<String> it = keyset.iterator();//此处的strs代表的是解析后的手续费数组,这里接口返回的是我传过去的值的对应值,不需要考虑乱序问题for (String str : strs) {//判断迭代器是否存在值while (it.hasNext()) {//拿到迭代器中的传进来的数据,例如didi,caocao,shenzhou等供应商,根据这个去解析data中的数据String keystr = it.next();//以下两行代码解析到供应商下的estimate_price结构JSONObject k1 = JSONObject.parseObject(jsons.getString(keystr));JSONObject k2 = JSONObject.parseObject(k1.getString("estimate_price"));//这里就是需要对price进行重新赋值,类似map直接put即可,注意格式k2.put("price", new BigDecimal(k2.getString("price")).add(new BigDecimal(str)));//同上直接赋值(业务需要)k2.put("real_price", new BigDecimal(k2.getString("real_price")).add(new BigDecimal(str)));//有点像map中的putAll()方法,将修改的值放回estimate_price中k1.put("estimate_price", k2);//将estiamte_price放回到供应商下,也就是keyStr下面jsons.put(keystr, k1);//跳出,执行下一个供应商break;}}//最后将更新后的值返回到前台,ok啦。return BaseResponse.success(jsons);

说实话,这里的重新赋值我弄了好一会,因为我最开始的考虑是为了避免重复赋值,是想删除set集合中的数据的。结果发现直接用迭代器他是直接会循环的,而外面那一层的手续费循环已经结束,所以也就不用考虑重复问题了。

还是需要多用下这个迭代器和集合的操作,不同的方式可以发现你自身更多的问题。

这篇关于解析JsonObject的数据结构(一)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/954750

相关文章

使用Python实现批量访问URL并解析XML响应功能

《使用Python实现批量访问URL并解析XML响应功能》在现代Web开发和数据抓取中,批量访问URL并解析响应内容是一个常见的需求,本文将详细介绍如何使用Python实现批量访问URL并解析XML响... 目录引言1. 背景与需求2. 工具方法实现2.1 单URL访问与解析代码实现代码说明2.2 示例调用

SSID究竟是什么? WiFi网络名称及工作方式解析

《SSID究竟是什么?WiFi网络名称及工作方式解析》SID可以看作是无线网络的名称,类似于有线网络中的网络名称或者路由器的名称,在无线网络中,设备通过SSID来识别和连接到特定的无线网络... 当提到 Wi-Fi 网络时,就避不开「SSID」这个术语。简单来说,SSID 就是 Wi-Fi 网络的名称。比如

SpringCloud配置动态更新原理解析

《SpringCloud配置动态更新原理解析》在微服务架构的浩瀚星海中,服务配置的动态更新如同魔法一般,能够让应用在不重启的情况下,实时响应配置的变更,SpringCloud作为微服务架构中的佼佼者,... 目录一、SpringBoot、Cloud配置的读取二、SpringCloud配置动态刷新三、更新@R

使用Java解析JSON数据并提取特定字段的实现步骤(以提取mailNo为例)

《使用Java解析JSON数据并提取特定字段的实现步骤(以提取mailNo为例)》在现代软件开发中,处理JSON数据是一项非常常见的任务,无论是从API接口获取数据,还是将数据存储为JSON格式,解析... 目录1. 背景介绍1.1 jsON简介1.2 实际案例2. 准备工作2.1 环境搭建2.1.1 添加

在C#中合并和解析相对路径方式

《在C#中合并和解析相对路径方式》Path类提供了几个用于操作文件路径的静态方法,其中包括Combine方法和GetFullPath方法,Combine方法将两个路径合并在一起,但不会解析包含相对元素... 目录C#合并和解析相对路径System.IO.Path类幸运的是总结C#合并和解析相对路径对于 C

Java解析JSON的六种方案

《Java解析JSON的六种方案》这篇文章介绍了6种JSON解析方案,包括Jackson、Gson、FastJSON、JsonPath、、手动解析,分别阐述了它们的功能特点、代码示例、高级功能、优缺点... 目录前言1. 使用 Jackson:业界标配功能特点代码示例高级功能优缺点2. 使用 Gson:轻量

Java如何接收并解析HL7协议数据

《Java如何接收并解析HL7协议数据》文章主要介绍了HL7协议及其在医疗行业中的应用,详细描述了如何配置环境、接收和解析数据,以及与前端进行交互的实现方法,文章还分享了使用7Edit工具进行调试的经... 目录一、前言二、正文1、环境配置2、数据接收:HL7Monitor3、数据解析:HL7Busines

python解析HTML并提取span标签中的文本

《python解析HTML并提取span标签中的文本》在网页开发和数据抓取过程中,我们经常需要从HTML页面中提取信息,尤其是span元素中的文本,span标签是一个行内元素,通常用于包装一小段文本或... 目录一、安装相关依赖二、html 页面结构三、使用 BeautifulSoup javascript

网页解析 lxml 库--实战

lxml库使用流程 lxml 是 Python 的第三方解析库,完全使用 Python 语言编写,它对 XPath表达式提供了良好的支 持,因此能够了高效地解析 HTML/XML 文档。本节讲解如何通过 lxml 库解析 HTML 文档。 pip install lxml lxm| 库提供了一个 etree 模块,该模块专门用来解析 HTML/XML 文档,下面来介绍一下 lxml 库

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig