Advertisement

Android万能解析并获取Json数据

阅读量:

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

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

Json的组成

在学习过程中,我查阅了许多关于JSON数据结构的信息。然而,在查阅的过程中发现所得的答案与我的预期并不完全一致。基于以上分析与思考,我对JSON数据的基本概念有了初步的认识。

很简单地说明一下,在Json数据中分为两种基本结构:JsonObjectJsonArray
首先来看一下什么是 JsonObject :它是以{ }包裹的对象数据组,并且里面至少包含一个键值对(key-value)。
接着我们再来看看另一种情况:什么是 JsonArray ?它则是通过[ ]来表示数组数据组,并且里面同样至少包含一个具体的数组元素。
无论是哪种情况,在处理非常复杂的 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 两种类型之一,从而完成后续处理流程。

在这里插入图片描述

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}的形式,因此我通过迭代器提取出其中所有的Key。接着,我从提取出的Key中选取特定的key1,调用jso.get(key1)来判断其对应的value是否仍为JsonObject?这类似于小偷试图撬开门锁的过程:他复制了钥匙并尝试打开外部的门。如果是一个简单的 JsonObject(即纯JsonObject数据),则将其中的所有内容转移到 Hashmap 中;但如果是一个嵌套的 JsonObject(即 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数据

在标准数据格式中(如JSON),Object与Hashmap遵循相同的键值对存储机制。然而,在实际应用中两者存在显著差异:前者支持有序插入特性而后者不具备这一功能。具体而言,在标准数据格式中(Object)类似于常见的{key, value}模式;而在JsonArray结构中则采用了数组存储方式,并不具备键值对的关系。当向容器中添加键值对时无需额外操作;而删除操作则需特别注意——这种无序访问的方式使得Array类型的容器难以满足需求。解决这一问题的方法较为简单:通过使用LinkedHashMap这一数据结构来实现有序插入,并保持键值对的顺序。

在这里插入图片描述
复制代码
    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数据的一种方案。该方案虽已完善但还存在可供改进的空间,请各位专家不吝赐教。

全部评论 (0)

还没有任何评论哟~