Android萬能解析Json(二)
上一篇已經介紹了萬能解析Json的原理,但是全部程式碼都寫在一個類裡就失去了重複利用的作用,所以對程式碼做作了提取,單獨寫在一個類裡。
Json資料轉化成hashmap(JsonToHashMap.class)
public class JsonToHashMap { String url; Handler handler; public JsonToHashMap(String url, Handler handler){ this.url=url; this.handler=handler;//註釋1 sendRequsetWithOKHttp(url); } public void sendRequsetWithOKHttp(String Url) { new Thread(new Runnable() { @Override public void run() { try{ //耗時操作放在新執行緒 OkHttpClient client = new OkHttpClient(); Request request = new Request.Builder().url(Url).build(); Response response = client.newCall(request).execute(); String responseData = response.body().string(); LinkedHashMap<String,Object> hashMaps=stringToJsonObject(responseData); Message message=new Message(); message.obj=hashMaps; handler.sendMessage(message); }catch (Exception e){ e.printStackTrace(); } } }).start(); } /* * 把Json資料放入hashmap * @param response * @return */ private LinkedHashMap<String, Object> stringToJsonObject(String response) { try { Object json=new JSONTokener(response).nextValue(); if(json instanceof JSONObject){ JSONObject jso = new JSONObject(response); return JsonObjectToHashMap(jso); }else{ JSONArray jsa=new JSONArray(response); return JsonArrayToHashMap(jsa); } } catch (JSONException e) { e.printStackTrace(); return null; } } private LinkedHashMap<String, Object> JsonObjectToHashMap(JSONObject jso) { LinkedHashMap<String, Object> hashmap = new LinkedHashMap<>(); try { for (Iterator<String> keyStr = jso.keys(); keyStr.hasNext(); ) { String key1 = keyStr.next().trim(); if (jso.get(key1) instanceof JSONObject) { JSONObject NextJSONObject=new JSONObject(jso.get(key1).toString()); hashmap.put(key1, JsonObjectToHashMap(NextJSONObject)); }else if(jso.get(key1) instanceof JSONArray) { JSONArray NextJSONArray =new JSONArray(jso.get(key1).toString()); hashmap.put(key1, JsonArrayToHashMap(NextJSONArray)); }else { hashmap.put(key1, jso.get(key1)); } } } catch (JSONException e) { e.printStackTrace(); } return hashmap; } private LinkedHashMap<String, Object> JsonArrayToHashMap(JSONArray jsa){ LinkedHashMap<String, Object> hashMap = new LinkedHashMap<>(); try { for (int i = 0; i < jsa.length(); i++) { if(jsa.get(i) instanceof JSONArray) { JSONArray NextJSONArray=new JSONArray(jsa.get(i).toString()); hashMap.put(String.valueOf(i), JsonArrayToHashMap(NextJSONArray)); }else if(jsa.get(i) instanceof JSONObject){ JSONObject NextJSONObject=new JSONObject(jsa.get(i).toString()); hashMap.put(String.valueOf(i),JsonObjectToHashMap(NextJSONObject)); } } }catch (JSONException e){ e.getStackTrace(); } return hashMap; } }
註釋1:因為在網站中提取Json資料是實線上程中完成的,所以在handler中得到hashmap無法回傳到呼叫該方法的類中
(如果有哪位大神指點怎麼回傳,請多指教),所以handler的操作解除安裝呼叫類中。
hashmap中提取資料(JsonForOne.class)
public class JsonForOne { static Object songs; public static String getpoint(LinkedHashMap<String, Object> LinkedHashMap, String[] s){ String get=null; String[] sr=s; java.util.LinkedHashMap<String ,Object> linked=LinkedHashMap; for(int i = 0;i<sr.length;i++){ songs=linked.get(sr[i]); if(songs instanceof java.util.LinkedHashMap){ linked=(java.util.LinkedHashMap<String ,Object>)songs; continue; }else { get=songs.toString(); } } return get; } }
使用方法
Handler handler=new Handler(){ public void handleMessage(Message msg) { hashMap=((LinkedHashMap<String, Object>)msg.obj); Processing(hashMap); } }; JsonToHashMap j=new JsonToHashMap("url",handler); public void Processing(LinkedHashMap<String, Object> map){ //具體操作 String[] name = { "key1值", "key2值"};//key1和key2為巢狀關係 String s = JsonForOne.getpoint(hashMap, name)//簡單的Json資料獲取 }
以上就是完整版的萬能Json資料方法,可大幅的減少程式碼的重複度