使用Gson对复杂json对象的成员进行删选

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值