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

2016/10/18更新html

以前作的解析都是错误的,由于在最里层循环添加对象,会出现同一个key对应的对象被以后建立的对象覆盖。在边上大牛的协助之下,成功完成了在三层循环中正确地建立符合原json结构的jsonObject对象。前端

以后,又想起了可guava的HashTable类,他的两个key一个value的数据结构也能正确处理这种表格类型的数据,并且只用两层循环。因此说工做中须要先解决需求问题,再考虑效率或代码结构,毕竟若是连需求都完不成就啥也别说了java

 

在工做时遇到一个问题,从一个网站的接口取得数据,再根据某个条件,将里面的数据提取出来。ajax

一开始的思路是根据条件,删除不符合条件的元素,后来发现仍是有问题,结果集不符合前端的要求,由于可能会出现这种数据:{'2016-10-10':{'123123123':[]}},它虽然是个合法的json字符串,可是里面并无任何数据,'123123123'这个key里是空数组,最终结果须要返回null。后来通过pm的提醒,选用了只提取符合条件的元素,再将其添加进一个空json对象中。我选择了gson做为工具,这个东东虽然在大数据量的时候处理速度慢,可是小量数据的时候仍是挺快的,而且api好用,符合面向对象的思想。至于json处理api哪一个效率高百度便可。json

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:先从目标网站上提取数据api

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次循环是没法避免的,也许须要在每一个循环内使用一个方法进行解析,以提高可读性

相关文章
相关标签/搜索