IT@程序员猿媛程序员

Android万能解析Json(二)

2019-04-05  本文已影响5人  Joey_Zjy

上一篇已经介绍了万能解析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数据方法,可大幅的减少代码的重复度

上一篇下一篇

猜你喜欢

热点阅读