日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時(shí)間:2025/4/5 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用Gson对复杂json对象的成员进行删选 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

為什么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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。