本文介绍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数据的更多相关文章

  1. Java构造和解析Json数据的两种方法详解二

    在www.json.org上公布了很多JAVA下的json构造和解析工具,其中org.json和json-lib比较简单,两者使用上差不多但还是有些区别.下面接着介绍用org.json构造和解析Jso ...

  2. 使用Go语言访问JSON数据(gojsonq)

    使用Go语言访问JSON数据(gojsonq) 主要是使用第三方的库 gojsonq,来查询JSON数据 例如这样的JSON数据 { "name":"computers& ...

  3. Java构造和解析Json数据的两种方法详解二——org.json

    转自:http://www.cnblogs.com/lanxuezaipiao/archive/2013/05/24/3096437.html 在www.json.org上公布了很多JAVA下的jso ...

  4. Java构造和解析Json数据的两种方法详解一——json-lib

    转自:http://www.cnblogs.com/lanxuezaipiao/archive/2013/05/23/3096001.html 在www.json.org上公布了很多JAVA下的jso ...

  5. EasyUI学习笔记(1)----Tree控件实现过程中.NET下无法访问json数据的解决办法

    直接调用官网的Demo中的方法 , 将json数据存储在同目录下,但是在运行之后树没有出现,用FireBug调试,错误如下 不允许访问json数据,刚开始以为是权限不够,然后又给解决方案所在的文件夹设 ...

  6. Java创建和解析Json数据方法(五)——Google Gson包的使用

    (五)Google Gson包的使用 1.简介 Gson包中,使用最多的是Gson类的toJson()和fromJson()方法:         ①toJson():将java对象转化为json数据 ...

  7. Java创建和解析Json数据方法(四)——json-lib包的使用

    (四)json-lib包的使用         既然json-lib包比org.json包重量级,那么json-lib包肯定有很多org.json包没有的类和方法,这篇笔记简单记录json-lib包中 ...

  8. Java中用HttpsURLConnection访问Https链接

    在web应用交互过程中,有很多场景需要保证通信数据的安全:在前面也有好多篇文章介绍了在Web Service调用过程中用WS-Security来保证接口交互过程的安全性,值得注意的是,该种方式基于的传 ...

  9. Java构造和解析Json数据的两种方法详解一

    一.介绍 JSON-lib包是一个beans,collections,maps,java arrays 和XML和JSON互相转换的包,主要就是用来解析Json数据,在其官网http://www.js ...

随机推荐

  1. node-sass模块的安装

    使用淘宝源 npm config set sass_binary_site=https://npm.taobao.org/mirrors/node-sass/ npm config set phant ...

  2. 常见程序入口点(OEP)特征

    delphi: 55            PUSH EBP  8BEC          MOV EBP,ESP  83C4 F0       ADD ESP,-10  B8 A86F4B00   ...

  3. 查看JVM内存使用状况

    1.jps:查看本地正在运行的java进程和进程ID(pid) 2.jinfo pid,查看指定pid的所有JVM信息 1)jinfo -flags pid 查询虚拟机运行参数信息. 2)jinfo ...

  4. npm安装material-design-icons总是失败

    项目中使用npm或者cnpm安装material-design-icons总是失败 解决办法: 1.自己上github下载后拷贝到项目node_modules目录下 2.还有npm安装老出问题,npm ...

  5. android控件基本布局

    <?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android=&qu ...

  6. 关于if判断和switch

    1.if判断: if(条件1){ 执行语句: } else if(条件2)}{ 执行语句2: } else{ 执行语句3: } if里面可以有无限个else if,而else if里面能嵌套无限个if ...

  7. python之路-----django 自定义cookie签名

    1.默认自定义cookie 在使用扩展签名时,会根据settings 配置中的  SIGNING_BACKEND 来运行加密方法,默认使用 django.core.signing.TimestampS ...

  8. Dynamic learning rate in training - 培训中的动态学习率

    I'm using keras 2.1.* and want to change the learning rate during training. I know about the schedul ...

  9. Mac上安装Docker

    安装这个东东有两种方法:在线安装和手动安装 在线安装: 打开终端,直接输入brew cask install docker之后回车,执行的过程中会要求输入password(就是你电脑的登录密码),输入 ...

  10. 有关@NgModule装饰器巩固

    declarations —— 该应用所拥有的组件. imports —— 导入 BrowserModule 以获取浏览器特有的服务,比如 DOM 渲染.无害化处理和位置(location). pro ...