JSON三种数据解析方法「建议收藏」

JSON三种数据解析方法「建议收藏」引言JSON数据现在是我们开发中用的最多的,百分之八十的数据都是通过JSON方式进行传输,那么想要学好JSON解析就要了解什么是JSON数据,怎么快速解析它从而提升开发效率。

大家好,又见面了,我是你们的朋友全栈君。

JSON数据现在是我们开发中用的最多的,百分之九十的数据都是通过JSON方式进行传输,那么想要学好JSON解析就要了解什么是JSON数据,怎么快速解析它从而提升开发效率。

1 什么是JSON数据?

  • 先看下面,这里有一段JSON数据,我们根据这段数进行讲解:
{ 
   
  "paramz": { 
   
    "feeds": [
      { 
   
        "id": 299076,
        "oid": 288340,
        "category": "article",
        "data": { 
   
          "subject": "荔枝新闻3.0:不止是阅读",
          "summary": "江苏广电旗下资讯类手机应用“荔枝新闻”于近期推出全新升级换代的3.0版。",
          "cover": "/Attachs/Article/288340/3e8e2c397c70469f8845fad73aa38165_padmini.JPG",
          "pic": "",
          "format": "txt",
          "changed": "2015-09-22 16:01:41"
        }
      }
    ],
    "PageIndex": 1,
    "PageSize": 20,
    "TotalCount": 53521,
    "TotalPage": 2677
  }
}

其实JSON数据就是一段字符串而已,只不过有不同意义的分隔符将其分割开来而已,我们看上面的符号,里面有[] ,{}等符号,其中

  • 1 []中括号代表的是一个数组;
  • 2 {}大括号代表的是一个对象
  • 3 双引号“”表示的是属性值
  • 4 冒号:代表的是前后之间的关系,冒号前面是属性的名称,后面是属性的值,这个值可以是基本数据类型,也可以是引用数据类型。

2 了解了JSON数据的格式,怎么对这段数据进行解析呢?

JSONObject系统自带的解析方式解析,我们先来JSONObject(系统自带的类)类中的方法:

这里写图片描述

  • 上面用红框框出来的是我们手动解析最常用的方法了,好了,现在我们想要解析上面的一段数据,该怎么做呢?这里我写了一个解析类如下:
public class JsonUtils { 
   

    /** * 根据json数据解析返回一个List<HashMap<String, Object>>集合 * @param json json数据 * @return */
    public static List<HashMap<String, Object>> getJsonList(String json) { 
   
        List<HashMap<String, Object>> dataList;
        dataList = new ArrayList<>();
        try { 
   
            JSONObject rootObject = new JSONObject(json);
            JSONObject paramzObject = rootObject.getJSONObject("paramz");
            JSONArray feedsArray = paramzObject.getJSONArray("feeds");
            for (int i = 0; i < feedsArray.length(); i++) { 
   
                JSONObject sonObject = feedsArray.getJSONObject(i);
                JSONObject dataObject = sonObject.getJSONObject("data");
                String subjectStr = dataObject.getString("subject");
                String summaryStr = dataObject.getString("summary");
                String coverStr = dataObject.getString("cover");
                HashMap<String, Object> map = new HashMap<>();
                map.put("subject", subjectStr);
                map.put("summary", summaryStr);
                map.put("cover", coverStr);
                dataList.add(map);
            }
            return dataList;
        } catch (JSONException e) { 
   
            e.printStackTrace();
        }
        return null;
    }
}

相信很简单一看就懂了吧,此方法写起来主要是比较费时间罢了,无非就是几个方法不停的调用而已,所以显得特别的费时费力,下面我又写了一个解析的方法,方法中会有一些冗余的代码,是为了更加深刻理解JSON解析而写的,实际中可以删掉,也用了一行GSON解析,GSON解析下面会见讲到:

其中DataModel对象我是将data对象使用GsonFormat插件工具生成的,使用方式可以自行搜索

public class DataModel { 
   

    /** * subject : "荔枝新闻3.0:不止是阅读" * summary : "江苏广电旗下资讯类手机应用“荔枝新闻”于近期推出全新升级换代的3.0版。" * cover : "/Attachs/Article/288340/3e8e2c397c70469f8845fad73aa38165_padmini.JPG" * pic : * format : video * changed : 2015-11-07 14:35:22 */

    public String subject;
    public String summary;
    public String cover;
    public String pic;
    public String format;
    public String changed;

    @Override
    public String toString() { 
   
        return "DataModel{" +
                "subject='" + subject + '\'' +
                ", summary='" + summary + '\'' +
                ", cover='" + cover + '\'' +
                ", pic='" + pic + '\'' +
                ", format='" + format + '\'' +
                ", changed='" + changed + '\'' +
                '}';
    }
}
 /** * 根据json对象获取List<DataModel>集合 * @param json 数据 * @return */
    public static List<DataModel> getGsonList(String json) { 
   
        List<DataModel> dataList;
        try { 
   
            JSONObject rootObject = new JSONObject(json);
            JSONObject paramzObject = rootObject.getJSONObject("paramz");

            /** * JSONArray的构造方法获取JSONArray对象 */
            JSONArray jsonArray = new JSONArray(paramzObject.getString("feeds"));
            Log.i(TAG, "jsonarray.length():"+jsonArray.length());

            /** * 获取JSONObject对象的属性关键字 */
            Iterator<String> iterators = paramzObject.keys();
            while (iterators.hasNext()) { 
   
                Log.i(TAG, "iterators: " + iterators.next());
            }
            JSONArray feeds = paramzObject.getJSONArray("feeds");
            dataList = new ArrayList<>();
            for (int i = 0; i < feeds.length(); i++) { 
   
                JSONObject jsonObject = feeds.getJSONObject(i);
                DataModel model = new Gson().fromJson(jsonObject.getString("data"), new TypeToken<DataModel>() { 
   
                }.getType());
                Log.i(TAG, "DataModel: " + model.toString());
                dataList.add(model);
            }
            return dataList;
        } catch (JSONException e) { 
   
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        return null;
    }

简单总结一下上面的解析吧:

1 对于JSONObject对象来说,想要得到一个JSONObject对象通常可以通过

  • (a):构造方式:JSONObject(String json)-> JSONObject rootObject = new JSONObject(json);
  • (b):JSONObject getJSONObject(String name){}-> JSONObject paramzObject = rootObject.getJSONObject(“paramz”);

2 对于JSONArray对象来说,想要得到一个JSONArray对象通常可以通过

  • (a):构造方式:JSONArray(String json)->JSONArray jsonArray = new JSONArray(paramzObject.getString(“feeds”));
  • (b):JSONObject getJSONObject(String name){}-> JSONArray feeds = paramzObject.getJSONArray(“feeds”);

3 Gson解析

我们如果懂得了上面的手动解析方式的话,那么对于Gson解析而言,就太简单了,下面我们就开始解析下面一段JSON数据:

{ 
   
    "homeadlist": [
        { 
   
            "id": 1,
            "imgurl": "/img/homead/a73b3f1d-0f14-429d-9d0f-70643fb0f0eb.jpg",
            "jumpflag": 0,
            "jumpurl": "",
            "posflag": 1,
            "remark": "1111",
            "cityid": 1
        },
        { 
   
            "id": 12,
            "imgurl": "/img/homead/eb442fbf-49db-4ba6-a102-d781505f426d.jpg",
            "jumpflag": 0,
            "jumpurl": "",
            "posflag": 2,
            "remark": "",
            "cityid": 1
        },
        { 
   
            "id": 14,
            "imgurl": "/img/homead/68109460-635d-4c5c-8be8-64d7c7889d18.jpg",
            "jumpflag": 0,
            "jumpurl": "http://shiranlife.kuaizhan.com/",
            "posflag": 4,
            "remark": "",
            "cityid": 1
        }
    ]
}

首先我们使用GsonFormat工具生成一个类HomeadListModel:

public class HomeadListModel { 
   

    /** * code : 1 * data : {"homeadlist":[{"id":1,"imgurl":"/img/homead/a73b3f1d-0f14-429d-9d0f-70643fb0f0eb.jpg","jumpflag":0,"jumpurl":"","posflag":1,"remark":"1111","cityid":1},{"id":12,"imgurl":"/img/homead/eb442fbf-49db-4ba6-a102-d781505f426d.jpg","jumpflag":0,"jumpurl":"","posflag":2,"remark":"","cityid":1},{"id":14,"imgurl":"/img/homead/68109460-635d-4c5c-8be8-64d7c7889d18.jpg","jumpflag":0,"jumpurl":"http://shiranlife.kuaizhan.com/","posflag":4,"remark":"","cityid":1}]} */

    public int code;
    public DataBean data;

    public static class DataBean { 
   
        public List<HomeadlistBean> homeadlist;

        public static class HomeadlistBean { 
   
            public int id;
            public String imgurl;
            public int jumpflag;
            public String jumpurl;
            public int posflag;
            public String remark;
            public int cityid;
        }
    }
}

我们使用OKHttpClient,代码如下

OkHttpClient.Builder builder = new OkHttpClient.Builder();

        Request request = new Request.Builder()
                .url(url)
                .get()
                .build();

        builder.build().newCall(request).enqueue(new Callback() { 
   
            @Override
            public void onFailure(Call call, IOException e) { 
   

            }

            @Override
            public void onResponse(Call call, Response response) throws IOException { 
   
                Gson gson = new Gson();
                /** * java.lang.IllegalStateException: closed * 因为OkHttp请求回调中response.body().string()只能有效调用一次 * */

                String string = response.body().string();
                Log.i("aaa", "response: " + string);
                /** * 重新构建一个response 因为response.body().string()调用一次之后流就断掉了,只能有效调用一次 */
                MediaType mediaType = response.body().contentType();
                Response response1 = response.newBuilder().body(ResponseBody.create(mediaType, string)).build();
                String string1 = response1.body().string();
                Log.i("aaa", "response1: " + string1);
                /** * 将json数据转换为对象 */
                HomeadListModel model = gson.fromJson(string1, HomeadListModel.class);
                //HomeadListModel model2 = gson.fromJson(string1, new TypeToken<HomeadListModel>() { 
   
                }.getType());
                /** * 将对象转换为json数据 */
                String jsonString = gson.toJson(model);
                Log.i("aaa", "onResponse2: " + jsonString);

                for (HomeadListModel.DataBean.HomeadlistBean data : model.data.homeadlist) { 
   
                    mData.add(imageUrl + data.imgurl);
                }
                runOnUiThread(new Runnable() { 
   
                    @Override
                    public void run() { 
   
                        mAdapter.notifyDataSetChanged();
                    }
                });
            }
        });

我们想要将一个json数据转换为对象的话需要使用fromJson(String json, Class classOfT) /fromJson(String json, Type typeOfT),当我们需要将对象转换为String的时候根据String toJson(Object src)方法即可。这里需要注意一点,如果response.body().string()调用大于一次的话,就会报错java.lang.IllegalStateException: closed,因为response.body().string()调用一次之后流就断掉了,需要重新构建一个response;

4 FastJson解析

  • 这个解析和Gson解析差不多,也是一行就搞定了,也是对上面的Gson数据进行解析,想要将json数据解析成对象需要使用 parseObject()方法,参数可以传Class,也可以传Type;当需要通过对象得到String字符串时候使用String json1 = JSONObject.toJSONString(model)即可,下面贴上代码:
OkHttpClient.Builder builder = new OkHttpClient.Builder();
        Request request = new Request.Builder()
                .url(url)
                .get()
                .build();
        builder.build().newCall(request).enqueue(new Callback() { 
   
            @Override
            public void onFailure(Call call, IOException e) { 
   

            }

            @Override
            public void onResponse(Call call, Response response) throws IOException { 
   

                String json = response.body().string();
                /** * 根据json数据获取对象 */
                HomeadListModel model = JSONObject.parseObject(json, new TypeToken<HomeadListModel>() { 
   
                }.getType());
// HomeadListModel model2 = JSONObject.parseObject(json, HomeadListModel.class);

                /** * 根据对象获取json数据 */
                String json1 = JSONObject.toJSONString(model);
                Log.i("aaa", "fastJson: " + json1);

                for (HomeadListModel.DataBean.HomeadlistBean data : model.data.homeadlist) { 
   
                    mData.add(imageUrl + data.imgurl);
                }
                runOnUiThread(new Runnable() { 
   
                    @Override
                    public void run() { 
   
                        mAdapter.notifyDataSetChanged();
                    }
                });
            }
        });

结尾:上面写了三种解析JSON数据的方法,第一种是最麻烦的,但是不一定是最差的,后面两种Gson和FastJson都是最常用的方法,本博客里面用到的API也是最常用的API,基本开发都够用了,其余未涉及到的请自行查看源码学习吧。


想要系统学习Android知识体系的,可以免费关注我的博客和Github,你的关注和支持是每一个技术人前进的动力。

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/134566.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • mysql开启慢日志查询_MySQL慢sql检验生效

    mysql开启慢日志查询_MySQL慢sql检验生效MySQL给我们提供了一个很好的功能,那就是慢查询!所谓的慢查询就是通过设置来记录超过一定时间的SQL语句!那么如何应用慢查询呢?1.开启MySQL的慢查询日志功能默认情况下,MySQL是不会记录超过一定执行时间的SQL语句的。要开启这个功能,我们需要修改MySQL的配置文件:windows下修改my.ini,(注册表,计算机\HKEY_LOCAL_MACHINE\SYSTEM\CurrentCo…

    2022年10月14日
  • 查看并设置mysql隔离级别

    查看并设置mysql隔离级别1、查看当前会话的隔离级别:select@@tx_isolation;2、查看系统的隔离级别:select@@global.tx_isolation;3、设置会话的隔离级别,隔离级别由低到高设置依次为:setsessiontransactonisolationlevelreaduncommitted;setsessiontransactoni…

  • virsh强制关闭虚拟机_kvm创建虚拟机

    virsh强制关闭虚拟机_kvm创建虚拟机virsh可以通过reboot、shutdown来重启或关闭对应的虚拟机。由于其原理是host通过发送acpi指令来控制虚拟机的电源,如果guest系统没有安装acpi服务器或该服务器没有启动,那么虚拟机将不会重启或关闭,那么只有使用destroy来强制关闭。安装acpid服务centos系统yuminstallacpidubuntu系统apt-getinstallacp…

  • phpstrom 2021.12激活吗(JetBrains全家桶)「建议收藏」

    (phpstrom 2021.12激活吗)这是一篇idea技术相关文章,由全栈君为大家提供,主要知识点是关于2021JetBrains全家桶永久激活码的内容https://javaforall.cn/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~1435QFILVV-eyJsaWNlb…

  • c#的基本输入与输出

    c#的基本输入与输出

  • CLion激活码 2021永久激活码(最新序列号破解)

    CLion激活码 2021永久激活码(最新序列号破解),https://javaforall.cn/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号