使用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次循環是沒法避免的,也許須要在每一個循環內使用一個方法進行解析,以提高可讀性

相關文章
相關標籤/搜索