使用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对象的成员进行删选的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql 只导数据不含表结构
- 下一篇: css响应式布局 兼容ie6