使用Gson对复杂json对象的成员进行删选
为什么80%的码农都做不了架构师?>>>
2016/10/18更新
之前做的解析都是错误的,因为在最里层循环添加对象,会出现同一个key对应的对象被之后创建的对象覆盖。在边上大牛的协助之下,成功完成了在三层循环中正确地创建符合原json结构的jsonObject对象。
之后,又想起了可guava的HashTable类,他的两个key一个value的数据结构也能正确处理这种表格类型的数据,而且只用两层循环。所以说工作中需要先解决需求问题,再考虑效率或代码结构,毕竟如果连需求都完不成就啥也别说了
在工作时遇到一个问题,从一个网站的接口取得数据,再根据某个条件,将里面的数据提取出来。
一开始的思路是根据条件,删除不符合条件的元素,后来发现还是有问题,结果集不符合前端的要求,因为可能会出现这种数据:{'2016-10-10':{'123123123':[]}},它虽然是个合法的json字符串,但是里面并没有任何数据,'123123123'这个key里是空数组,最终结果需要返回null。后来经过pm的提醒,选用了只提取符合条件的元素,再将其添加进一个空json对象中。我选择了gson作为工具,这个东东虽然在大数据量的时候处理速度慢,但是小量数据的时候还是挺快的,并且api好用,符合面向对象的思想。至于json处理api哪个效率高百度即可。
Document document = Jsoup.connect("http://rl.fx678.com/ajaxcountry.html?date=20161011&country=%E7%BE%8E%E5%85%83").header("X-Requested-With", "XMLHttpRequest").ignoreContentType(true).timeout(50000).get();String text = document.body().text();System.out.println(text);Gson gson = new Gson();JsonObject object = gson.fromJson(text, JsonObject.class);JsonObject result = new JsonObject();Set<Entry<String, JsonElement>> level1 = object.entrySet();for(Entry<String, JsonElement>level1Entry:level1){JsonObject asJsonObject = level1Entry.getValue().getAsJsonObject();Set<Entry<String, JsonElement>> level2 = asJsonObject.entrySet();for(Entry<String, JsonElement> level2Entry:level2){JsonArray array = level2Entry.getValue().getAsJsonArray();Iterator<JsonElement> iterator = array.iterator();while(iterator.hasNext()){JsonObject asJsonObject2 = iterator.next().getAsJsonObject();String string = asJsonObject2.get("ACTUAL_PRICE").toString();System.out.println(string);//未公布
// if(asJsonObject2.get("ACTUAL_PRICE").toString().equals("")){
// JsonObject object2 = new JsonObject();
// object2.add(level2Entry.getKey(), array);
// result.add(level1Entry.getKey(), object2);
// break;
// }
// 重要String s = asJsonObject2.get("IDX_RELEVANCE").getAsString();
// if("3".equals(s)){
// JsonObject object2 = new JsonObject();
// object2.add(level2Entry.getKey(), array);
// result.add(level1Entry.getKey(), object2);
// break;
// }//已公布if(!"".equals(string)){JsonObject object2 = new JsonObject();object2.add(level2Entry.getKey(), array);result.add(level1Entry.getKey(), object2);break;}}}}System.out.println(result.entrySet().size());System.out.println(result.toString());}
1:先从目标网站上提取数据
2.将其转换为jsonobject对象
3.遍历这个对象的entryset,为什么要用entryset是因为所有的key都是不固定的,所以必须取他的entryset
4.比较麻烦的就是遍历两层entry了,到了最后一层entryset,获取该层entryset的迭代器,对entry内的元素进迭代处理,将符合条件的元素存入一个新的json对象。
5.如何将结果存入一个新的json对象,就要使用到gson api了,相信不用看文档,只看api名称就能知道方法的作用了。需要注意的是,要从第二层开始新建对象,让外层的对象add里层的对象,这样最后得到的结果才是符合源数据的json嵌套结构。
6.说回到前端需要的结果上,如果最后的结果集的entryset大小为0,说明是一个空json对象,他的toString是“{}”这样的,它依然不是最终需要的结果,这时候就要返回null了,因为{}没有意义
7.最后说一下代码的问题,两层循环加一层while循环,三层循环,存在可读性差,代码厂的问题,至于效率我觉得除非找另一种思路处理,否则基于这个json的结构,3次循环是无法避免的,也许需要在每个循环内使用一个方法进行解析,以提升可读性
转载于:https://my.oschina.net/wwwd/blog/759241
使用Gson对复杂json对象的成员进行删选相关推荐
- Gson案例:Java对象与JSON字符串相互转换
Gson案例:Java对象与JSON字符串相互转换 一.Gson概述 Gson是一个Java类库,可将Java对象转换为相应的JSON形式,也可以将JSON字符串转换为对应的Java对象.Gson是一 ...
- Gson().fromJson将json字符串转成对象时,执行非常慢,原因可能是版本的问题
Gson().fromJson将json字符串转成对象时,执行非常慢,原因可能是版本的问题 1.将1.3的版本升级成1.7的,转换速度就非常快了 附: json数据大小
- fastjson判空_fastjson JSON 对象为空保留null
fastjson,对象转json字符串的过程中对value为null的值的一些处理 前言 fastjson是一个非常好用的java库,用于操作对象json序列化等等. 问题 最近在写代码的时候遇到问题 ...
- bos 获取数据库连接_java解析数据接口获取json对象
最近小编在做项目的时候,需要解析一个url以获取其数据,开始我为简便,使用了Postman这个工具来解析,也获取了json对象. 但后也发现,它没法直接连接数据库,也就是说这些数据不能直接存入数据库, ...
- java 视图对象转换,使用spring boot开发时java对象和Json对象转换的问题_JavaScript_网络编程...
将java对象转换为on对象,市面上有很多第三方jar包,如下: jackson(最常用) com.fasterxml.jackson.core jackson-databind 2.11.2 gso ...
- java使用getinputstream_java解析数据接口获取json对象
最近小编在做项目的时候,需要解析一个url以获取其数据,开始我为简便,使用了Postman这个工具来解析,也获取了json对象. 但后也发现,它没法直接连接数据库,也就是说这些数据不能直接存入数据库, ...
- Java对象转换为Json对象
前言 曾几何时,XML是程序员的宠儿,是数据传输.API.AJAX应用等方面的不二选择,但自从JSON横空出世后,或者你会发觉你身边就有很多人开始抛弃XML,在他们的心目中,JSON已经完全取代了XM ...
- jQuery调用WCF服务传递JSON对象
下面这个示例使用了WCF去创建一个服务端口从而能够被ASP.Net页面通过jQuery的AJAX方法访问,我们将在客户端使用Ajax技术来 与WCF服务进行通信.这里我们仅使用jQuery去连接Web ...
- 十分钟搞懂JSON(JSON对象---JSON字符串---对象 之间的区别)
好记性不如烂笔头,相信我,看了之后你会彻底搞懂JSON 前言:前天被JSON对象,JSON字符串,JAVA对象搞混了,不知道各自代表的意思,我就查了资料,总结为一篇博文. 另外我想List<Us ...
最新文章
- ubuntu登录界面循环登录
- 6.(Mysql数据管理相关)连接MYSQL,修改密码,增加新用户,数据库相关命令,表操作相关命令,数据相关命令,数据库sql导入和导出,备份数据库,查看不到mysql数据库的解决办法
- find 命令的参数详解
- shell之计算文本中单词出现频率
- tf.group()用于组合多个操作
- 出现问题protected:void __thiscall CTalkCDlg::OnIdok(void)(?OnIdok@CTalkDlg@@IAEXXZ)?
- 日期相关的小函数汇总
- Android-VR 支持流媒体
- visual studio 显示行号
- VHDL串口通信 在FPGA开发板上测试 并解决没有识别到下载接口USB_Blaster(No Hardware问题)
- android实时投屏软件下载,安卓投屏助手
- 人脸识别模型评价指标:完整梳理
- Qt5.12 QML——TextMetrics字体长度的测量指标
- MySQL ('root'@'%') does not exist的问题
- 为什么需要云计算机,为什么需要云计算?
- 超全!互联网大厂职级薪资表,全国各地互联网大厂分布(校招/社招/考研/考公)
- 推荐28个网站,让你边玩边学
- Rust 社区 RFC 导读 | 构建安全的 I/O
- 新电脑安装python环境
- 关于接入新浪微博第三方登录