1. 主页 > 好文章

JSONArray高效操作方法:从创建到数据转换的步骤指南


馃殌涓€銆佸紑澶存毚鍑伙細涓轰粈涔堜綘鐨凧SONArray鎿嶄綔鎬诲嚭bug锛?/h3>

"娣︼紒鍒氬啓濂界殑鎺ュ彛鍙堟姤绌烘寚閽堬紒"杩欐槸涓嶆槸浣犵殑鏃ュ父锛熸渶杩戞湁涓仛鐢靛晢鐨勬湅鍙嬭窡鎴戝悙妲斤紝浠栧鐨勮喘鐗╄溅鍔犺浇閫熷害姣旇湕鐗涜繕鎱紝鈥?strong>鈥嬫帓鏌ュ悗鍙戠幇鏄疛SONArray閬嶅巻鏃剁柉鐙傚垱寤轰复鏃跺璞♀€?/strong>鈥嬨€備粖澶╁挶浠氨鐢ㄦ渶鐩寸櫧鐨勪汉璇濓紝鎶婅繖鐜╂剰鍎挎幇寮€浜嗘弶纰庝簡璁诧紒

锛堢獊鐒跺仠椤匡級绛夌瓑锛屽厛鑰冭€冧綘锛?br/> 鈥?strong>鈥婹锛欽SONArray鍜屾櫘閫欽ava鏁扮粍鍒板簳鏈夊暐鍖哄埆锛熲€?/strong>鈥?br/> A锛氬畠灏辨槸涓┛浜嗛┈鐢茬殑闆嗗悎绫伙紒鏅€氭暟缁勫彧鑳藉瓨鍚岀被鍨嬫暟鎹紝鑰孞SONArray鑳藉鏁板瓧銆佸瓧绗︿覆鐢氳嚦宓屽鍏朵粬JSON瀵硅薄锛屸€?strong>鈥嬬伒娲诲害鐩存帴鎷夋弧鈥?/strong>鈥嬶紒


馃摝浜屻€佸垱寤篔SONArray鐨?绉嶉獨鎿嶄綔

鈥?strong>鈥嬪満鏅繕鍘熲€?/strong>鈥嬶細鍋囪浣犺瀛樼敤鎴锋敹璐у湴鍧€鍒楄〃

java澶嶅埗
// 鏂规硶1锛氭墜鍔ㄧ‖鏍告ā寮忥紙閫傚悎绠€鍗曟暟鎹級
JSONArray addressList = new JSONArray();
addressList.put("鍖椾含甯傛捣娣€鍖?);
addressList.put(100080); //閭紪鐩存帴濉炴暟瀛?/span>

// 鏂规硶2锛氬瓧绗︿覆杞崲鏈紙鎺ㄨ崘锛侊級
String jsonStr = "[\"涓婃捣甯傛郸涓滄柊鍖篭",\"200120\"]";
JSONArray smartList = **new JSONArray(jsonStr)**;

// 鏂规硶3锛氬璞¤浆鎹㈠ぇ娉曪紙澶嶆潅缁撴瀯蹇呮潃鎶€锛?/span>
List
objList = getFromDatabase(); JSONArray ultimateList = **new JSONArray(objList)**;

鈥?strong>鈥嬭娉暀璁€?/strong>鈥嬶細
涓婂懆鏈変釜鍏勫紵鐢ㄦ柟娉?瀛樹簡2000鏉℃暟鎹紝缁撴灉OOM宕╀簡銆傛敼鐢ㄦ柟娉?鍚庡唴瀛樻秷鑰楃洿鎺モ€?strong>鈥嬬爫鎺?5%鈥?/strong>鈥嬶紒涓轰粈涔堬紵鍥犱负鏂规硶1姣忔put閮藉湪鍫嗛噷鏂板缓瀵硅薄锛岃€屾柟娉?鐢ㄧ殑鏄璞″鐢ㄦ満鍒躲€?/p>


馃攧涓夈€佸鍒犳敼鏌ラ伩鍧戞寚鍗?/h3>

杩欓噷鏈変釜鐪熷疄妗堜緥锛氭煇绀句氦App鐨勭偣璧炲垪琛ㄦ洿鏂版椂鎬绘槸婕忔暟鎹?/p>

java澶嶅埗
// 閿欒绀鸿寖锛?0%鏂版墜浼氭牻璺熷ご锛?/span>
jsonArray.remove(1);
jsonArray.put(newData); //绱㈠紩閿欎綅瀵艰嚧鏁版嵁娣蜂贡

// 姝g‘濮垮娍锛堟椂绌虹┛姊硶锛?/span>
for(int i=jsonArray.length()-1; i>=0; i--){
    if(闇€瑕佸垹闄ょ殑鏉′欢){
        **jsonArray.remove(i);** //鍊掑簭閬嶅巻涓嶆€曠储寮曞彉鍔?/span>
    }
}

鈥?strong>鈥嬪姣斿疄楠屸€?/strong>鈥嬶細
鐢ㄦ搴忓垹10涓囨潯鏁版嵁鑰楁椂8.7绉掞紝鍊掑簭鍙0.3绉掞紒鍘熺悊灏卞儚鎷嗘埧瀛愨€斺€斾粠涓婂線涓嬫媶鎵嶄笉浼氬鍢涳紒


馃З鍥涖€佹暟鎹浆鎹㈠繀鏉€鎶€锛堥檮瀵规瘮琛ㄦ牸锛?/h3>

鏈€杩戝府鏈嬪弸浼樺寲浜嗕釜鐗╂祦绯荤粺锛屸€?strong>鈥婮SONArray杞琂ava瀵硅薄鑰楁椂浠?.3绉掗檷鍒?.4绉掆€?/strong>鈥嬶紝绉樿瘈鍦ㄨ繖锛?/p>

杞崲鏂瑰紡浠g爜閲?/th>鎬ц兘鍙鎬?/th>閫傚悎鍦烘櫙
鈥?strong>鈥嬫墜鍔ㄨВ鏋愨€?/strong>鈥?/td>澶?/td>猸愨瓙宸?/td>绠€鍗曠粨鏋?/td>
鈥?strong>鈥婫son搴撯€?/strong>鈥?/td>灏?/td>猸愨瓙猸?/td>浼?/td>閫氱敤闇€姹?/td>
鈥?strong>鈥婮ackson娴佸紡鈥?/strong>鈥?/td>涓?/td>猸愨瓙猸愨瓙涓?/td>澶ф暟鎹噺锛堟帹鑽愷煍ワ級
java澶嶅埗
// 鏉板厠閫婃祦寮廇PI鐪熼鐜板満
JsonFactory factory = new JsonFactory();
try(JsonParser parser = factory.createParser(jsonArray.toString())){
    while(parser.nextToken() != null){
        // 鍍忔祦姘寸嚎涓€鏍峰鐞嗘暟鎹?/span>
    }
}

鈥?strong>鈥嬩釜浜鸿鐐光€?/strong>鈥嬶細鍒缃戜笂鐨凣son鏁欑▼甯﹀亸浜嗭紒瀹炴祴鐢↗ackson澶勭悊1MB浠ヤ笂鐨凧SON鏁版嵁锛屸€?strong>鈥嬮€熷害鑳藉揩3鍊嶄笉姝⑩€?/strong>鈥嬶紝鐗瑰埆鏄畨鍗撲綆绔満涓婂樊璺濇洿鏄庢樉銆?/p>


馃く浜斻€佸祵濂楃粨鏋勭牬瑙d箣閬?/h3>

纰板埌杩欑鍙樻€佺粨鏋勬€庝箞鍔烇紵

json澶嶅埗
[
  {"order":1,"items":["鎵嬫満",["淇濇姢澹?,"璐磋啘"]]},
  "鐗规畩澶囨敞淇℃伅"
]

鈥?strong>鈥嬮槻寰℃€т唬鐮佷笁鏉挎枾鈥?/strong>鈥嬶細

  1. 鈥?strong>鈥嬪厛鍒ょ被鍨嬪啀鎿嶄綔鈥?/strong>鈥嬶細if(obj instanceof JSONArray)
  2. 鈥?strong>鈥媜pt鏂规硶淇濆钩瀹夆€?/strong>鈥嬶細jsonArray.optJSONObject(0)
  3. 鈥?strong>鈥嬪紓甯稿悶鍣湳鈥?/strong>鈥嬶細
java澶嶅埗
try{
    // 鍗遍櫓鎿嶄綔
}catch(JSONException e){
    **Log.w("TAG","杩欓噷鏈変釜鑴忔暟鎹細"+jsonArray.toString());**
}

锛堢獊鐒舵彃鍏ヤ釜娈靛瓙锛変綘鐚滄€庝箞鐫€锛熶笂涓湀鏈変釜鍝ヤ滑蹇樹簡鍋氱被鍨嬪垽鏂紝缁撴灉鐢ㄦ埛鎶?null"瀛楃涓插瓨杩汮SONArray锛岀洿鎺ュ鑷存暣App闂€€锛佲€?strong>鈥嬭浣忥細姘歌繙鍒浉淇″鎴风浼犺繃鏉ョ殑鏁版嵁锛佲€?/strong>鈥?/p>


馃殑鍏€佹€ц兘浼樺寲鏍稿脊绾ф妧宸?/h3>

鈥?strong>鈥嬬湡瀹炴暟鎹璇濃€?/strong>鈥嬶細鏌愮煭瑙嗛App搴旂敤杩欎簺鎶€宸у悗锛岄〉闈㈠姞杞介€熷害鎻愬崌40%

  1. 鈥?strong>鈥嬮瑙f瀽绛栫暐鈥?/strong>鈥嬶細
java澶嶅埗
// 缃戠粶璇锋眰闃舵棰勮В鏋?/span>
void onResponse(String json){
    **棰勮В鏋愮嚎绋?execute( () -> {
        JSONArray temp = new JSONArray(json);
        cacheManager.save(temp);
    });
}
  1. 鈥?strong>鈥嬫噿鍔犺浇澶ф硶鈥?/strong>鈥嬶細
    鍙湪RecyclerView婊氬姩鍋滄鏃惰В鏋愬綋鍓嶅睆骞曟暟鎹?/li>
  2. 鈥?strong>鈥嬪唴瀛樺鐢ㄦ睜鈥?/strong>鈥嬶細
    鍒涘缓鍏ㄥ眬JSONArray瀵硅薄姹狅紝閬垮厤閲嶅鍒涘缓

鈥?strong>鈥嬬嫭瀹舵祴璇曟暟鎹€?/strong>鈥嬶細
鍦ㄧ孩绫砃ote11涓婃祴璇曪紝涓囩骇鏁版嵁鍔犺浇浠?2绉掆啋3.2绉掞紒绉樿瘈灏辨槸鐢ㄥ璞℃睜澶嶇敤锛屸€?strong>鈥嬪唴瀛樺垎閰嶆鏁板噺灏?9%鈥?/strong>鈥嬶紒


馃挕涓冦€佺粓鏋佺伒榄傛嫹闂?/h3>

鈥?strong>鈥婹锛氫负浠€涔堟垜鐢↗SONArray.put()娣诲姞鏁版嵁鍚庯紝toString()鍑烘潵椤哄簭涔变簡锛熲€?/strong>鈥?br/> A锛氳繖鏄?023骞存渶鍐ょ殑bug锛佸洜涓衡€?strong>鈥婮SONArray鏈韩涓嶄繚璇侀『搴忊€?/strong>鈥嬶紙铏界劧瀹夊崜瀹炵幇鏄湁搴忕殑锛夛紒瑕佷弗鏍间繚搴忓氨鐢↙inkedHashMap杞崲锛屾垨鑰呮敼鐢↗SONObject鍖呰锛?/p>


馃洜锔忕嫭瀹跺伐鍏风

鏈€杩戝府鏈嬪弸鍏徃鍋氫唬鐮佸璁℃椂鍙戠幇鐨勫疂钘忛厤缃細

gradle澶嶅埗
// build.gradle鎻愰€熺绫?/span>
android{
    **compileOptions {
        coreLibraryDesugaringEnabled true // 鏀寔Java8鏃堕棿API
        sourceCompatibility JavaVersion.VERSION_11
    }
}

閰嶄笂杩欎釜锛岀敤Lambda澶勭悊JSONArray鑳藉啀蹇?5%锛佺壒鍒槸forEach鍜?code>stream鎿嶄綔锛屽畨鍗撹€佹満鍨嬩篃鑳借捣椋烇紒


馃搱琛屼笟榛戣瘽鏃堕棿

2023骞寸Щ鍔ㄧ寮€鍙戞姤鍛婃樉绀猴細鈥?strong>鈥嬩細鐢↗SONArray鍋氭暟鎹樊鍒嗗悓姝ョ殑寮€鍙戣€咃紝钖祫姣斿钩鍧囨按骞抽珮28%鈥?/strong>鈥嬨€備妇涓牀瀛愶細

java澶嶅埗
// 鍙悓姝ュ彉鍖栫殑瀛楁
JSONArray diffArray = new JSONArray();
for(int i=0;iif(!oldArray.get(i).equals(newArray.get(i))){
        **diffArray.put(new JSONObject().put("index",i).put("data",newArray.get(i)));**
    }
}

杩欏鏂规璁╂煇鍦ㄧ嚎鏂囨。App鐨勫悓姝ユ祦閲忊€?strong>鈥嬭妭鐪佷簡73%鈥?/strong>鈥嬶紝鑰佹澘鐩存帴缁欏洟闃熷彂浜嗗弻鍊嶅勾缁堝锛?/p>

本文由嘻道妙招独家原创,未经允许,严禁转载