Android万能解析并获取Json数据

Android万能解析并获取Json数据,无需导包

想要解析Json数据,首先要了解Json数据的组成

Json的组成

我自己学的时候查了很多关于json数据的结构,得到的答案都不是自己想要的,以下是本人对Json数据初略的理解。

很简单,Json数据中由两种结构组成,JsonObjectJsonArray
JsonObject:就是用 { } 括起一个对象Object的数据组,是由一个或多个 {key,value} 这种数据组成。
JsonArray:就是用 [ ] 括起一个数组Array的数据组,是由一个或多个 [ ] 数组数据组成。
无论多复杂的Json数据都是有这两种数据组成,就像俄罗斯套娃一样,一个套一个形成复杂的数据结构。

知道组成之后我们就可以进行对数据的解析

解析Json数据就像是小偷去别人家里偷东西一样。

废话不多说,解析走起

从网站中获取Json数据,转化成String

private void sendRequsetWithOKHttp() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                try{
                    //耗时操作放在新线程
                    OkHttpClient client = new OkHttpClient();
                    Request request = new Request.Builder().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();
    }

不懂得小伙伴自行百度OKhttp

判断Json数据结构并分别解析

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;
        }


    }

先把从网站中获取的Json数据的String放进一个对象Object中,进行判断第一层是JsonArray还是JsonObject,继续进行下一步的工作
Android万能解析并获取Json数据_第1张图片

JsonObject解析方法

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;
    }

上面提到JsonObject结构为 {Key,value} ,所以我用迭代器把JsonObject中的key提取出来。
然后利用提取的key取出jso.get(key1)判断value值是否还是JsonObject?
就像小偷去翘门,复制了门的钥匙,用钥匙打开门,看看里面是房间还是另一扇门。如果是房间(纯粹的jsonObject数据)的话就把房间里的东西全部转到袋子(Hashmap)里,如果是门(JsonObject中套JsonObject)就接着翘。

JsonArray解析方法

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;
    }

获取Json数据

JsonArrayJsonObject的方法基本一致,唯一不同的是插入hashmap中的key值的类型,JsonObjectStringJsonArrayint,就像有的开门是用钥匙,有的用指纹。
但是在json数据中JsonObject是和hashmap一样的 {key,value} 结构。但是JsonArray结构是数组结构,没有key值。然后hashmap的插入是无序的,插入的时候没有事,转一转格式就进去了。但是取出的时候Object可以取出你想要的值,Array这个杀千刀的却不行。
解决的方法也很简单,用LinkedHashmap<>,这东西就是有序插入到Hashmap中。
Android万能解析并获取Json数据_第2张图片

private String getpoint(LinkedHashMap<String ,Object> LinkedHashMap, String[] s){
        String get=null;
        String[] index=s;
        LinkedHashMap<String ,Object> linked=LinkedHashMap;
        for(int i = 0;i<sr.length;i++){
            songs=linked.get(sr[i]);
            if(songs instanceof LinkedHashMap){
               linked=(LinkedHashMap<String ,Object>)songs;
               continue;
            }else {
                get=songs.toString();
            }
        }
        return get;
    }

以上就是万能解析并获取Json数据的方法,不足之处希望大家请教
完整的代码:GitHub传送门

你可能感兴趣的:(Android万能解析并获取Json数据)