Android万能解析Json(一)

Android万能解析并获取Json数据,所有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 hashMaps=stringToJsonObject(responseData);

                    //把数据传出线程

                    Message message=new Message();

                    message.obj=hashMaps;

                    handler.sendMessage(message);

                }catch (Exception e){

                    e.printStackTrace();

                }

            }

        }).start();

    }

不懂得小伙伴自行百度OKhttp


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


private LinkedHashMap 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,继续进行下一步的工作

image

JsonObject解析方法


private LinkedHashMap JsonObjectToHashMap(JSONObject jso) {

        LinkedHashMap hashmap = new LinkedHashMap<>();

        try {

            for (Iterator 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 JsonArrayToHashMap(JSONArray jsa){

        LinkedHashMap 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中。

image

private String getpoint(LinkedHashMap LinkedHashMap, String[] s){

        String get=null;

        String[] index=s;

        LinkedHashMap linked=LinkedHashMap;

        for(int i = 0;i)songs;

              continue;

            }else {

                get=songs.toString();

            }

        }

        return get;

    }

以上就是万能解析并获取Json数据的方法,不足之处希望大家请教

完整的代码:GitHub传送门

你可能感兴趣的:(Android万能解析Json(一))