在Java中用 . 深层访问JSON数据
本文介绍Java中解析JSON的一种方法,可以让我们在Java程序中也用x.x.x的形式访问JSON数据中的值。
代码大部分来源非本人,本人在源代码基础上加以修改以使正常运行。
代码:
// 将提取方法进行封装成方法 方便调用
@SuppressWarnings("unchecked")
public static Object getKeyJsonQuery(Map<?,?> map ,String jsonKey){
String[] arrs = jsonKey.split("\\.");
Object obj = null;
for(int i=0;i<arrs.length;i++){
if(i==0) {
obj = handle(map, arrs[i]);
}else{
if(obj instanceof Map){
obj = handle((Map<?, ?>) obj,arrs[i]);
}else if(obj instanceof List){
obj = handle((List<Map<?, ?>>) obj,arrs[i]);
}
}
}
return obj;
}
//解析map类型的对象
public static Object handle(Map<?,?> map,String key){
return map.get(key);
}
// 解析list类型的对象
@SuppressWarnings("unchecked")
public static Object handle(List<Map<?,?>> listMap,String key){
List<Map<String,Object>> listMaps = new ArrayList<>();
List<Object> lists = new ArrayList<>();
// 这里用到了java8的一个新特性 stream 流
listMap.stream().filter(e->null !=e.get(key) ).forEach(e->{
//表示既不是map 又不是list类型
if(!(e.get(key) instanceof Map<?,?>) && !(e.get(key) instanceof List<?>) ) {
lists.add(e.get(key));
}else{
listMaps.addAll((Collection<? extends Map<String, Object>>) e.get(key));
}
});
return lists.size()>0 && !lists.isEmpty() ? lists:listMaps;
} public static void main(String[] args) throws Exception {
String json = "{\"data\":{\"order\":[{\"money\":\"15\",\"orders\":[{\"b1\":[{\"bc1\":\"1\",\"bc2\":\"2\"},{\"bc1\":\"2\",\"bc2\":\"3\"}],\"b2\":\"2\"},{\"b1\":[{\"bc1\":\"1\",\"bc2\":\"2\"},{\"bc1\":\"2\",\"bc2\":\"3\"}],\"b2\":\"3\"}]},{\"money\":\"16\",\"orders\":[{\"b1\":[{\"bc1\":\"1\",\"bc2\":\"2\"},{\"bc1\":\"2\",\"bc2\":\"3\"}],\"b2\":\"2\"},{\"b1\":[{\"bc1\":\"1\",\"bc2\":\"2\"},{\"bc1\":\"2\",\"bc2\":\"3\"}],\"b2\":\"3\"}]},{\"money\":\"17\",\"orders\":[{\"b1\":[{\"bc1\":\"1\",\"bc2\":\"2\"},{\"bc1\":\"2\",\"bc2\":\"3\"}],\"b2\":\"2\"},{\"b1\":[{\"bc1\":\"1\",\"bc2\":\"2\"},{\"bc1\":\"2\",\"bc2\":\"3\"}],\"b2\":\"3\"}]}],\"info\":{\"record\":[{\"a1\":\"1\",\"a2\":\"2\"},{\"a1\":\"1\",\"a2\":\"2\"},{\"a1\":\"1\",\"a2\":\"2\"}]}},\"time\":{\"addr\":\"123\",\"num\":{\"a\":\"111\",\"b\":\"222\"}}}";
Gson gson = new Gson();
@SuppressWarnings("unchecked")
Map<String,Object> map = gson.fromJson(json, Map.class);
System.out.println(map.toString());
String jsonKey = "data.order.money";
//String jsonKey = "time.num.a";
//String jsonKey ="data.info";
Object obj = getKeyJsonQuery(map,jsonKey);
System.out.println(obj.toString());
}
---------------------
作者:YancyMauno
来源:CSDN
原文:https://blog.csdn.net/ITmaotongxue/article/details/83013769?utm_source=copy
版权声明:本文为博主原创文章,转载请附上博文链接!
在Java中用 . 深层访问JSON数据的更多相关文章
- Java构造和解析Json数据的两种方法详解二
在www.json.org上公布了很多JAVA下的json构造和解析工具,其中org.json和json-lib比较简单,两者使用上差不多但还是有些区别.下面接着介绍用org.json构造和解析Jso ...
- 使用Go语言访问JSON数据(gojsonq)
使用Go语言访问JSON数据(gojsonq) 主要是使用第三方的库 gojsonq,来查询JSON数据 例如这样的JSON数据 { "name":"computers& ...
- Java构造和解析Json数据的两种方法详解二——org.json
转自:http://www.cnblogs.com/lanxuezaipiao/archive/2013/05/24/3096437.html 在www.json.org上公布了很多JAVA下的jso ...
- Java构造和解析Json数据的两种方法详解一——json-lib
转自:http://www.cnblogs.com/lanxuezaipiao/archive/2013/05/23/3096001.html 在www.json.org上公布了很多JAVA下的jso ...
- EasyUI学习笔记(1)----Tree控件实现过程中.NET下无法访问json数据的解决办法
直接调用官网的Demo中的方法 , 将json数据存储在同目录下,但是在运行之后树没有出现,用FireBug调试,错误如下 不允许访问json数据,刚开始以为是权限不够,然后又给解决方案所在的文件夹设 ...
- Java创建和解析Json数据方法(五)——Google Gson包的使用
(五)Google Gson包的使用 1.简介 Gson包中,使用最多的是Gson类的toJson()和fromJson()方法: ①toJson():将java对象转化为json数据 ...
- Java创建和解析Json数据方法(四)——json-lib包的使用
(四)json-lib包的使用 既然json-lib包比org.json包重量级,那么json-lib包肯定有很多org.json包没有的类和方法,这篇笔记简单记录json-lib包中 ...
- Java中用HttpsURLConnection访问Https链接
在web应用交互过程中,有很多场景需要保证通信数据的安全:在前面也有好多篇文章介绍了在Web Service调用过程中用WS-Security来保证接口交互过程的安全性,值得注意的是,该种方式基于的传 ...
- Java构造和解析Json数据的两种方法详解一
一.介绍 JSON-lib包是一个beans,collections,maps,java arrays 和XML和JSON互相转换的包,主要就是用来解析Json数据,在其官网http://www.js ...
随机推荐
- 手动脱壳—dump与重建输入表(转)
文章中用到的demo下载地址: http://download.csdn.net/detail/ccnyou/4540254 附件中包含demo以及文章word原稿 用到工具: Ollydbg Lor ...
- 一些重要的k8s概念
1. Pause容器是什么 作为init pod存在,其他pod都会从pause 容器中fork出来 由pause容器管理 pause容器的工作 可知kubernetes的pod抽象基于Linux的n ...
- windows系统下安装rabbitmq教程
1.简介 安装rabbitmq需要下载软件Erlang语言开发包和RabbitMQ文件包.文件最新下载地址如下: Erlang: https://www.erlang.org/ RabbitMQ: h ...
- 缺少的文件是 ..\packages\Microsoft.Net.Compilers.1.0.0\build\Microsoft.Net.Compilers.props。
报错信息: 严重性 代码 说明 项目级别 文件 行 禁止显示状态 工具错误 这台计算机上缺少此项目引用的 NuGet 程序包.使用“NuGet 程序包还原”可下载这些程序包.有关更多信息,请参见 ht ...
- vbs 去掉字符串中的空格
今天在写自动化脚本时,需要把字符串中的空格替换成其他特殊字符,但字符间的空格个数又不确定,经过搜索,成功解决. 解决重点就是把每个空格字符串搜索出来,然后进行替换,主要用到space函数. strSt ...
- 分享张鑫旭大神的,纯css打字小技巧,我顺便收藏一下
CSS代码: .typing { width: 15em; white-space: nowrap; border-right: 2px solid transparent; animation: t ...
- linux常用命令 echo输出命令
echo输出命令 'echo [选项] [输出内容]' 选项 '-e' 支持反斜线控制的字符转换 控制字符 \a 输出警告音 \b 退格键,也就是向左删除键 \n 换行符 \r 回车键 \t 制表符 ...
- QPS的优化
cdn加速 吧静态资源放到别人的服务器上 精灵图 后台数据库用mysql+redis sql的优化 用缓存 程序架构:集群化部署 ,分布式+异步 celery:分布式异步任务框架 语言
- 清除冗余的css
下载旧版的火狐浏览器,如Firefox 48.0.exe, 下载地址:https://ftp.mozilla.org/pub/firefox/releases/48.0/win32/zh-CN 关闭更 ...
- Android向通讯录添加联系人的一般方法
Android向通讯录添加联系人的一般方法 以一个简单的例子加以说明,记得需要相应的权限: 测试代码,关键的内容就在add函数里面. package zhangphil.demo; import an ...