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