递归方法读取任意深度的 JSON 对象的键值
有以下json字符串
{"name":"John","age":30,"address":{"city":"New York","state":"NY","zip":"10001","coordinates":{"latitude":40.712776,"longitude":-74.005974,"accuracy":5,"details":{"description":"Exact location of the building"}},"details":{"street":"123 Main St","apt":"4B","building":{"name":"Central Park Tower","floors":98,"amenities":{"gym":true,"pool":true,"parking":{"garage":true,"valet":true}}}}}
}
读取valet层级中的值
1、maven中导入依赖,导入了两种json字符串转JsonObject的依赖
<dependencies><dependency><groupId>org.json</groupId><artifactId>json</artifactId><version>20210307</version></dependency><!-- https://mvnrepository.com/artifact/com.alibaba/fastjson --><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>2.0.15</version></dependency></dependencies>
2、实现递归读取json中某一层级的key值
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
//import org.json.JSONObject;public class ReadJson {public static void main(String[] args) {String jsonString = "{\"name\":\"John\",\"age\":30,\"address\":{\"city\":\"New York\",\"state\":\"NY\",\"zip\":\"10001\",\"coordinates\":{\"latitude\":40.712776,\"longitude\":-74.005974,\"accuracy\":5,\"details\":{\"description\":\"Exact location of the building\"}},\"details\":{\"street\":\"123 Main St\",\"apt\":\"4B\",\"building\":{\"name\":\"Central Park Tower\",\"floors\":98,\"amenities\":{\"gym\":true,\"pool\":true,\"parking\":{\"garage\":true,\"valet\":true}}}}}}";//JSONObject json = new JSONObject(jsonString);JSONObject json = JSON.parseObject(jsonString);//valet在第五层级String valetParking = getValueByKey(json, "valet");System.out.println(valetParking);}public static String getValueByKey(JSONObject json, String key) {String result = null;for (String k : json.keySet()) {Object value = json.get(k);if (value instanceof JSONObject) { //遇到jsonobject继续递归result = getValueByKey((JSONObject) value, key);if (result != null) {break;}} else if (k.equals(key)) { //遇到某一层级的叶子节点如果和key相等于,找到答案跳出循环返回一个result,然后再回到递归getValueByKey返回一个结果,判断不为空跳出本次递归的循环,return返回结果,再回到之前的递归返回的结果还是之前的直接不为空跳出本次递归的循环,返回return,接着再回到之前的递归....result = value.toString();break;}}return result;}}
运行过程:遇到jsonobject继续递归;遇到某一层级的叶子节点如果和key相等于,找到答案跳出循环执行return result,然后再回到递归getValueByKey返回刚才的return结果,判断不为空跳出本次递归的循环,return返回结果,再回到之前的递归返回的结果还是之前的直接不为空跳出本次递归的循环,返回return结果,接着再回到之前的递归....最终走完递归
缺点:如果寻找的key在多个层级存在,只能返回最近一个层级的key
优点:只需要传我想要的key即可
针对多个层级存在相同key的问题,可以使用下面的代码来实现
import org.json.*;public class ReadJsonV2 {public static void main(String[] args) {// 要解析的JSON字符串String jsonString = "{\"name\":\"John\",\"age\":30,\"address\":{\"city\":\"New York\",\"state\":\"NY\",\"zip\":\"10001\",\"coordinates\":{\"latitude\":40.712776,\"longitude\":-74.005974,\"accuracy\":5,\"details\":{\"description\":\"Exact location of the building\"}},\"details\":{\"street\":\"123 Main St\",\"apt\":\"4B\",\"building\":{\"latitude\":\"Central Park Tower\",\"floors\":98,\"amenities\":{\"gym\":true,\"pool\":true,\"parking\":{\"garage\":true,\"valet\":true}}}}}}";// 解析JSON字符串JSONObject jsonObject = new JSONObject(jsonString);// 获取某个层级的键//String keyString = "address.coordinates.latitude";String keyString = "address.details.building.latitude";String[] keys = keyString.split("\\.");String make = getJsonValue(jsonObject, keys);System.out.println(make); // 输出 "Ford"}private static String getJsonValue(JSONObject jsonObject, String[] keys) {JSONObject currentObject = jsonObject;for (String key : keys) {if (currentObject.has(key)) {Object obj = currentObject.get(key);if (obj instanceof JSONObject) {currentObject = (JSONObject) obj;} else {return obj.toString();}} else {return null;}}return null;}
}
在这个实现中,我们将传入的键名字符串"address.details.building.latitude"拆分成一个字符串数组{"
address", "
details","
building","
latitude"}
。然后,我们将该数组传递给getJsonValue
方法,该方法使用该数组来遍历JSON对象。如果存在该键名,则将其转换为JSON对象类型并将其赋值给currentObject
。如果该键名不存在,返回null。如果该键对应的对象不是JSON对象类型,则将其转换为字符串并返回。
通过这种方式,我们可以轻松地使用点号分隔的字符串来查找JSON对象中的任何层级的键值对。
相关文章:
递归方法读取任意深度的 JSON 对象的键值
有以下json字符串 {"name":"John","age":30,"address":{"city":"New York","state":"NY","zip":"10001","coordinates":{"latitude":40.712776,&q…...
黑马redis学习记录:分布式锁
一、基本原理和实现方式对比 分布式锁:满足分布式系统或集群模式下多进程可见并且互斥的锁。 分布式锁的核心思想就是让大家都使用同一把锁,只要大家使用的是同一把锁,那么我们就能锁住线程,不让线程进行,让程序串行…...
对React-Fiber的理解,它解决了什么问题?
对React-Fiber的理解,它解决了什么问题?Fiber用来解决什么问题?Fiber是什么?Fiber是如何解决问题的?Fiber用来解决什么问题? JavaScript引擎和页面渲染引擎两个线程是互斥的,当其中一个线程执行…...
【Linux】初学Linux你需要掌握这些基本指令(二)
目录 1.man指令 2.cp指令 3.mv指令 4.tree指令 5.echo指令 6.more指令 7.less指令(重要) 8.head与tail指令 9.date指令 显示时间常用参数: 设置时间常用参数: 10.cal指令 11.find & whereis & which指令 …...
Linux中VI/VIM 编辑器
1、概述所有Linux系统都会内置vi文本编辑器vim是vi的升级版,可以主动以字体颜色分辨语法的正确性,代码补完和编译,错误跳转等功能。2、vi和vim的三种模式基本上 vi/vim 共分为三种模式,分别是一般模式、编辑模式、命令模式2.1、一…...
PDF怎么转换成Word?两种PDF免费转Word方法推荐
不知道你们有没有发现,我们在网上下载的很多资料都是PDF格式的,尽管PDF文件也可以通过专门的PDF编辑器来编辑,但是PDF文档作为版式文档,编辑起来还是存在很多局限性,所有当我们需要大量编辑修改文档的时候,…...
极兔一面:Dockerfile如何优化?注意:千万不要只说减少层数
说在前面 在40岁老架构师 尼恩的读者交流群(50)中,面试题是一个非常、非常高频的交流话题。 最近,有小伙伴面试极兔时,遇到一个面试题: 如果优化 Dockerfile? 小伙伴没有回答好,只是提到了减少镜像层数。…...
SpringBoot+Vue实现酒店客房管理系统
文末获取源码 开发语言:Java 框架:springboot JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7/8.0 数据库工具:Navicat11 开发软件:eclipse/myeclipse/idea Maven包:Maven3.3.9 浏…...
自适应多因素认证:构建不可破解的企业安全防线|身份云研究院
打开本文意味着你理解信息安全的重要性,并且希望获取行业最佳实践来保护你所在组织的信息安全。本文将带你了解多因素认证(MFA:Multi-Factor-Authentication)对于企业信息安全的重要性以及实施方法。 多因素认证(MFA&…...
阶段二8_集合ArrayList_学生管理系统_详细步骤
一.学生管理系统案例 1.需求: 针对目前我们的所学内容,完成一个综合案例:学生管理系统! 该系统主要功能如下: 1.添加学生:通过键盘录入学生信息,添加到集合中 2.删除学生:通过键盘录…...
一篇解决Linux 中的负载高低和 CPU 开销并不完全对应
负载是查看 Linux 服务器运行状态时很常用的一个性能指标。在观察线上服务器运行状况的时候,我们也是经常把负载找出来看一看。在线上请求压力过大的时候,经常是也伴随着负载的飙高。 但是负载的原理你真的理解了吗?我来列举几个问题&#x…...
关于IDM下载器,提示:一个假冒的序列号被用来注册……idea项目文件路径报红
关于IDM下载器,提示:一个假冒的序列号被用来注册……到C:\Windows\System32\drivers\etc 修改目录下面的hosts文件(如果没有修改的权限就右键属性hosts文件修改user的权限为完全控制),在hosts里面增加以下内容…...
JVM - 高效并发
目录 Java内存模型和内存间的交互操作 Java内存模型 内存间的交互操作 内存间交互操作的规则 volatile特性 多线程中的可见性 volatile 指令重排原理和规则 指令重排 指令重排的基本规则 多线程中的有序性 线程安全处理 锁优化 锁优化之自旋锁与自适应自旋 锁优…...
中小学智慧校园电子班牌系统源码 Saas云平台模式
智慧电子班牌区别于传统电子班牌,智慧校园电子班牌系统更加注重老师和学生的沟通交流和及时数据交互。学校为每个教室配置一台智能电子班牌,一般安装于教室门口,用来实时显示学校通知、班级通知,可设置集中分布式管理,…...
记录一次服务器被攻击的经历
突然收到阿里云发过来的异常登陆的信息: 于是,急忙打开电脑查看对应的ECS服务器的记录: 发现服务器的cpu占用率异常飙升,所以可以大概断定服务器已经被非法入侵了。 通过自己的账号登陆后,发现sshd服务有异常的链接存…...
Python解题 - CSDN周赛第29期 - 争抢糖豆
本期问哥是志在必得,这本算法书我已经觊觎许久,而之前两次因为种种原因未能如愿。因此,问哥这几天花了不少时间,把所有之前在每日一练做过的题目重新梳理了一遍。苦心人,天不负,感谢官方大大! 第…...
C代码中访问链接脚本中的符号
一、目的在之前的《GNU LD脚本命令语言(一)》、《GNU LD脚本命令语言(二)》我们介绍了GNU链接脚本的知识点,基本上对链接脚本中的SECTION、REGION、以及加载地址与执行地址的关系等内容有了一定的了解。本篇主要讲解链…...
MySQL 8:MySQL索引
索引就是通过一定的算法建立数据模型,用于快速查找某一列中具有特定值的行。如果没有索引,MySQL 必须从第一条记录开始读取整个表,直到找到相关的表。表越大,查询数据所花费的时间就越多。如果表中查询的列有索引,MySQ…...
JVM详解
一,JVM 1,JVM区域划分 类装载器,运行时数据区,字节码执行引擎 2,JVM内存模型(运行时数据区) 由本地方法栈,虚拟机栈,堆,方法区,和程序计数器组成。…...
MySQL数据库调优————索引数据结构
B-TREE B-TREE数据结构 B-TREE特性 根节点的子结点个数2 < X < m,m是树的阶 假设m 3,则根节点可有2-3个孩子 中间节点的子节点个数m/2 < y < m 假设m 3,中间节点至少有2个孩子,最多3个孩子 每个中间节点包含n个关…...
visual studio 改变界面语言
在使用visual studio 2019 时,开始是英文界面,后面变成了中文界面。但是看视频教学时有的是英文界面,我就想回到英文界面,所以有切换界面语言的需要。其实操作很简单:工具-> 选项 打开界面在界面里选择环境…...
2023.2.16每日一题——1250. 检查「好数组」
每日一题题目描述解题核心解法一:数论题目描述 题目链接:1250. 检查「好数组」 给你一个正整数数组 nums,你需要从中任选一些子集,然后将子集中每一个数乘以一个 任意整数,并求出他们的和。 假如该和结果为 1&#x…...
亿级高并发电商项目-- 实战篇 --万达商城项目 八(安装FastDFS、安装Nginx、文件服务模块、文件上传功能、商品功能与秒杀商品等功能)
专栏:高并发---分布式项目 👏作者简介:大家好,我是小童,Java开发工程师,CSDN博客博主,Java领域新星创作者 📕系列专栏:前端、Java、Java中间件大全、微信小程序、微信支…...
Viper捐款7000万韩元,合计人民币是多少钱?
Viper捐款7000万韩元,合计人民币是多少钱? #2023LCK春季赛##英雄联盟# #Viper捐款7000万韩元# Viper向大田东区捐款 7000 万,成为大田荣誉协会 105 号会员。Viper选手从 2019 年开始一直向大田东区捐款,但是他不希望这件事被公开…...
前端vue实现系统拦截跳转外链并进入跳转询问界面
跳转询问界面如下图所示: 给自己挖坑的实现方式,最终解决方案请看最底下 思路:正常情况下我们有2种方式跳转外链 第一种非a标签,我们手动添加事件进行跳转 <div class"dingdan public-padding p-item" click&quo…...
【Linux】Shell(Bash)单引号、双引号、不加引号和反引号用法和区别详解
简要总结 不加引号:不会将含有空格的字符串视为一个整体输出, 如果内容中有变量等,会先把变量解析出结果,然后在输出最终内容来,如果字符串中带有空格等特殊字符,则不能完整的输出,需要改加双引号ÿ…...
本人使用的idea插件
文章目录🚏 本人使用的idea插件🚬 pojo to Json🚬 GsonFormatPlus🚬 EasyYapi🚬 Chinese (Simplified) Language Pack / 中文语言包🚬 MyBatis Log Free🚬 MyBatisPlusX🚬 Statistic…...
站在行业C位,谷医堂打开健康管理服务新思路
对于农村及贫困地区老百姓来说,由于交通因素和家庭经济条件制约,看病难致身体调理情况一直不太乐观,这也导致心理压力很大。然而,随着近年中医药产业崛起与快速发展,这种局面很快就会得到改观,以湖南谷医堂…...
ABO溶血症概率
[简介]ABO溶血是由于母亲和胎儿ABO血型不合引起的新生儿溶血,概率不是很大,一般出现在准妈妈是O血,准爸爸是非O血,这次容易发生血型不合,但新生儿ABO溶血概率不高,大多数症状相对较轻。ABO溶血的概率是什么…...
【算法数据结构体系篇class03】:数组、链表、栈、队列、递归时间复杂度、哈希表、有序表问题
一、反转链表package class03;import java.util.ArrayList; import java.util.List;/*** 链表反转*/ public class ReverseLinkedList {public static class Node {public int value;public Node next;public Node(int data) {value data;}}public static class DoubleNode {p…...
建设一个网站需要做哪些工作内容/网站seo是干什么的
1.1 几种常见存储设备的接口 1.IDE接口 IDE的英文全称为"Integrated Drive Electronics",即"电子集成驱动器",是曾经主流的硬盘接口。IDE接口也称之为ATA接口。ATA的英文拼写为"Advanced Technology Attachment"。2003年推…...
简历模板可编辑/苏州整站优化
2019独角兽企业重金招聘Python工程师标准>>> 计算机 》 属性 》 高级系统设置 》 指向你的安装目录 转载于:https://my.oschina.net/u/3608045/blog/1647983...
wordpress 长图片滑动/信息流广告素材网站
【小白从小学Python、C、Java】 【Python-计算机等级考试二级】 【Python-数据分析】 Python数据分析 判断列表中元素是否全为True 判断列表中元素至少有一个为True all()和any() [太阳]选择题 以下python代码中两次输出结果分别是什么? a [1.0, True, 0, "a&quo…...
深圳网站维护页面设计/南阳seo优化
lambda 函数是一个可以接收任意多个参数(包括可选参数)并且返回单个表 达式值的函数 1、lambda 函数比较轻便,即用即仍,很适合需要完成一项功能,但是此功能只 在此一处使用,连名字都很随意的情况下; 2、匿名函数&a…...
带积分的网站建设/温州网站建设开发
对上高职业技术学校感兴趣的同学有了解过上高职业技术学校的录取分数线吗?很多同学由于没有提前查询好学校的招生分数线,导致自己去到学校准备报名的时候才发现自己并没有满足学校的录取要求,可是这个时候已经为此浪费很多的时间和精力,得不…...
手机商场网站制作/谷歌浏览器安卓版下载
给列其别名: SELECT RTRIM(vend_name) ( RTRIM(vend_contry) ) AS vend_title FROM Vendors ORDER BY vend_name; 这种sql做什么事情呢? 分解出一个简单的东西: SELECT vend_name,vend_contry FROM Vendors ORDER BY vend_name; 得到的数据是这样: vend_name vend_contr…...