美文网首页程序员
Android万能解析Json(一)

Android万能解析Json(一)

作者: Joey_Zjy | 来源:发表于2019-02-24 23:52 被阅读23次

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

    image

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

    image
    
    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(一)

        本文链接:https://www.haomeiwen.com/subject/mlbiyqtx.html