使用Gson对复杂json对象的成员进行删选
為什么80%的碼農(nóng)都做不了架構(gòu)師?>>> ??
2016/10/18更新
之前做的解析都是錯(cuò)誤的,因?yàn)樵谧罾飳友h(huán)添加對(duì)象,會(huì)出現(xiàn)同一個(gè)key對(duì)應(yīng)的對(duì)象被之后創(chuàng)建的對(duì)象覆蓋。在邊上大牛的協(xié)助之下,成功完成了在三層循環(huán)中正確地創(chuàng)建符合原json結(jié)構(gòu)的jsonObject對(duì)象。
之后,又想起了可guava的HashTable類(lèi),他的兩個(gè)key一個(gè)value的數(shù)據(jù)結(jié)構(gòu)也能正確處理這種表格類(lèi)型的數(shù)據(jù),而且只用兩層循環(huán)。所以說(shuō)工作中需要先解決需求問(wèn)題,再考慮效率或代碼結(jié)構(gòu),畢竟如果連需求都完不成就啥也別說(shuō)了
?
在工作時(shí)遇到一個(gè)問(wèn)題,從一個(gè)網(wǎng)站的接口取得數(shù)據(jù),再根據(jù)某個(gè)條件,將里面的數(shù)據(jù)提取出來(lái)。
一開(kāi)始的思路是根據(jù)條件,刪除不符合條件的元素,后來(lái)發(fā)現(xiàn)還是有問(wèn)題,結(jié)果集不符合前端的要求,因?yàn)榭赡軙?huì)出現(xiàn)這種數(shù)據(jù):{'2016-10-10':{'123123123':[]}},它雖然是個(gè)合法的json字符串,但是里面并沒(méi)有任何數(shù)據(jù),'123123123'這個(gè)key里是空數(shù)組,最終結(jié)果需要返回null。后來(lái)經(jīng)過(guò)pm的提醒,選用了只提取符合條件的元素,再將其添加進(jìn)一個(gè)空json對(duì)象中。我選擇了gson作為工具,這個(gè)東東雖然在大數(shù)據(jù)量的時(shí)候處理速度慢,但是小量數(shù)據(jù)的時(shí)候還是挺快的,并且api好用,符合面向?qū)ο蟮乃枷搿V劣趈son處理api哪個(gè)效率高百度即可。
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:先從目標(biāo)網(wǎng)站上提取數(shù)據(jù)
2.將其轉(zhuǎn)換為jsonobject對(duì)象
3.遍歷這個(gè)對(duì)象的entryset,為什么要用entryset是因?yàn)樗械膋ey都是不固定的,所以必須取他的entryset
4.比較麻煩的就是遍歷兩層entry了,到了最后一層entryset,獲取該層entryset的迭代器,對(duì)entry內(nèi)的元素進(jìn)迭代處理,將符合條件的元素存入一個(gè)新的json對(duì)象。
5.如何將結(jié)果存入一個(gè)新的json對(duì)象,就要使用到gson api了,相信不用看文檔,只看api名稱(chēng)就能知道方法的作用了。需要注意的是,要從第二層開(kāi)始新建對(duì)象,讓外層的對(duì)象add里層的對(duì)象,這樣最后得到的結(jié)果才是符合源數(shù)據(jù)的json嵌套結(jié)構(gòu)。
6.說(shuō)回到前端需要的結(jié)果上,如果最后的結(jié)果集的entryset大小為0,說(shuō)明是一個(gè)空json對(duì)象,他的toString是“{}”這樣的,它依然不是最終需要的結(jié)果,這時(shí)候就要返回null了,因?yàn)閧}沒(méi)有意義
7.最后說(shuō)一下代碼的問(wèn)題,兩層循環(huán)加一層while循環(huán),三層循環(huán),存在可讀性差,代碼廠的問(wèn)題,至于效率我覺(jué)得除非找另一種思路處理,否則基于這個(gè)json的結(jié)構(gòu),3次循環(huán)是無(wú)法避免的,也許需要在每個(gè)循環(huán)內(nèi)使用一個(gè)方法進(jìn)行解析,以提升可讀性
轉(zhuǎn)載于:https://my.oschina.net/wwwd/blog/759241
總結(jié)
以上是生活随笔為你收集整理的使用Gson对复杂json对象的成员进行删选的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: mysql 只导数据不含表结构
- 下一篇: UltraEdit的使用方法