当前位置:   article > 正文

JSON解析的三种方式

json解析

1 什么是JSON数据?

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

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

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

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

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

  • 上面用红框框出来的是我们手动解析最常用的方法了,好了,现在我们想要解析上面的一段数据,该怎么做呢?这里我写了一个解析类如下:
  1. public class JsonUtils {
  2. /**
  3. * 根据json数据解析返回一个List<HashMap<String, Object>>集合
  4. * @param json json数据
  5. * @return
  6. */
  7. public static List<HashMap<String, Object>> getJsonList(String json) {
  8. List<HashMap<String, Object>> dataList;
  9. dataList = new ArrayList<>();
  10. try {
  11. JSONObject rootObject = new JSONObject(json);
  12. JSONObject paramzObject = rootObject.getJSONObject("paramz");
  13. JSONArray feedsArray = paramzObject.getJSONArray("feeds");
  14. for (int i = 0; i < feedsArray.length(); i++) {
  15. JSONObject sonObject = feedsArray.getJSONObject(i);
  16. JSONObject dataObject = sonObject.getJSONObject("data");
  17. String subjectStr = dataObject.getString("subject");
  18. String summaryStr = dataObject.getString("summary");
  19. String coverStr = dataObject.getString("cover");
  20. HashMap<String, Object> map = new HashMap<>();
  21. map.put("subject", subjectStr);
  22. map.put("summary", summaryStr);
  23. map.put("cover", coverStr);
  24. dataList.add(map);
  25. }
  26. return dataList;
  27. } catch (JSONException e) {
  28. e.printStackTrace();
  29. }
  30. return null;
  31. }
  32. }

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

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

  1. public class DataModel {
  2. /**
  3. * subject : "荔枝新闻3.0:不止是阅读"
  4. * summary : "江苏广电旗下资讯类手机应用“荔枝新闻”于近期推出全新升级换代的3.0版。"
  5. * cover : "/Attachs/Article/288340/3e8e2c397c70469f8845fad73aa38165_padmini.JPG"
  6. * pic :
  7. * format : video
  8. * changed : 2015-11-07 14:35:22
  9. */
  10. public String subject;
  11. public String summary;
  12. public String cover;
  13. public String pic;
  14. public String format;
  15. public String changed;
  16. @Override
  17. public String toString() {
  18. return "DataModel{" +
  19. "subject='" + subject + '\'' +
  20. ", summary='" + summary + '\'' +
  21. ", cover='" + cover + '\'' +
  22. ", pic='" + pic + '\'' +
  23. ", format='" + format + '\'' +
  24. ", changed='" + changed + '\'' +
  25. '}';
  26. }
  27. }
  1. /**
  2. * 根据json对象获取List<DataModel>集合
  3. * @param json 数据
  4. * @return
  5. */
  6. public static List<DataModel> getGsonList(String json) {
  7. List<DataModel> dataList;
  8. try {
  9. JSONObject rootObject = new JSONObject(json);
  10. JSONObject paramzObject = rootObject.getJSONObject("paramz");
  11. /**
  12. * JSONArray的构造方法获取JSONArray对象
  13. */
  14. JSONArray jsonArray = new JSONArray(paramzObject.getString("feeds"));
  15. Log.i(TAG, "jsonarray.length():"+jsonArray.length());
  16. /**
  17. * 获取JSONObject对象的属性关键字
  18. */
  19. Iterator<String> iterators = paramzObject.keys();
  20. while (iterators.hasNext()) {
  21. Log.i(TAG, "iterators: " + iterators.next());
  22. }
  23. JSONArray feeds = paramzObject.getJSONArray("feeds");
  24. dataList = new ArrayList<>();
  25. for (int i = 0; i < feeds.length(); i++) {
  26. JSONObject jsonObject = feeds.getJSONObject(i);
  27. DataModel model = new Gson().fromJson(jsonObject.getString("data"), new TypeToken<DataModel>() {
  28. }.getType());
  29. Log.i(TAG, "DataModel: " + model.toString());
  30. dataList.add(model);
  31. }
  32. return dataList;
  33. } catch (JSONException e) {
  34. // TODO Auto-generated catch block
  35. e.printStackTrace();
  36. }
  37. return null;
  38. }

  1. /**
  2. * 根据json对象获取List<DataModel>集合
  3. * @param json 数据
  4. * @return
  5. */
  6. public static List<DataModel> getGsonList(String json) {
  7. List<DataModel> dataList;
  8. try {
  9. JSONObject rootObject = new JSONObject(json);
  10. JSONObject paramzObject = rootObject.getJSONObject("paramz");
  11. /**
  12. * JSONArray的构造方法获取JSONArray对象
  13. */
  14. JSONArray jsonArray = new JSONArray(paramzObject.getString("feeds"));
  15. Log.i(TAG, "jsonarray.length():"+jsonArray.length());
  16. /**
  17. * 获取JSONObject对象的属性关键字
  18. */
  19. Iterator<String> iterators = paramzObject.keys();
  20. while (iterators.hasNext()) {
  21. Log.i(TAG, "iterators: " + iterators.next());
  22. }
  23. JSONArray feeds = paramzObject.getJSONArray("feeds");
  24. dataList = new ArrayList<>();
  25. for (int i = 0; i < feeds.length(); i++) {
  26. JSONObject jsonObject = feeds.getJSONObject(i);
  27. DataModel model = new Gson().fromJson(jsonObject.getString("data"), new TypeToken<DataModel>() {
  28. }.getType());
  29. Log.i(TAG, "DataModel: " + model.toString());
  30. dataList.add(model);
  31. }
  32. return dataList;
  33. } catch (JSONException e) {
  34. // TODO Auto-generated catch block
  35. e.printStackTrace();
  36. }
  37. return null;
  38. }

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

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数据:

  1. {
  2. "homeadlist": [
  3. {
  4. "id": 1,
  5. "imgurl": "/img/homead/a73b3f1d-0f14-429d-9d0f-70643fb0f0eb.jpg",
  6. "jumpflag": 0,
  7. "jumpurl": "",
  8. "posflag": 1,
  9. "remark": "1111",
  10. "cityid": 1
  11. },
  12. {
  13. "id": 12,
  14. "imgurl": "/img/homead/eb442fbf-49db-4ba6-a102-d781505f426d.jpg",
  15. "jumpflag": 0,
  16. "jumpurl": "",
  17. "posflag": 2,
  18. "remark": "",
  19. "cityid": 1
  20. },
  21. {
  22. "id": 14,
  23. "imgurl": "/img/homead/68109460-635d-4c5c-8be8-64d7c7889d18.jpg",
  24. "jumpflag": 0,
  25. "jumpurl": "http://shiranlife.kuaizhan.com/",
  26. "posflag": 4,
  27. "remark": "",
  28. "cityid": 1
  29. }
  30. ]
  31. }

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

  1. public class HomeadListModel {
  2. /**
  3. * code : 1
  4. * 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}]}
  5. */
  6. public int code;
  7. public DataBean data;
  8. public static class DataBean {
  9. public List<HomeadlistBean> homeadlist;
  10. public static class HomeadlistBean {
  11. public int id;
  12. public String imgurl;
  13. public int jumpflag;
  14. public String jumpurl;
  15. public int posflag;
  16. public String remark;
  17. public int cityid;
  18. }
  19. }
  20. }

我们使用OKHttpClient,代码如下

  1. OkHttpClient.Builder builder = new OkHttpClient.Builder();
  2. Request request = new Request.Builder()
  3. .url(url)
  4. .get()
  5. .build();
  6. builder.build().newCall(request).enqueue(new Callback() {
  7. @Override
  8. public void onFailure(Call call, IOException e) {
  9. }
  10. @Override
  11. public void onResponse(Call call, Response response) throws IOException {
  12. Gson gson = new Gson();
  13. /**
  14. * java.lang.IllegalStateException: closed
  15. * 因为OkHttp请求回调中response.body().string()只能有效调用一次
  16. *
  17. */
  18. String string = response.body().string();
  19. Log.i("aaa", "response: " + string);
  20. /**
  21. * 重新构建一个response 因为response.body().string()调用一次之后流就断掉了,只能有效调用一次
  22. */
  23. MediaType mediaType = response.body().contentType();
  24. Response response1 = response.newBuilder().body(ResponseBody.create(mediaType, string)).build();
  25. String string1 = response1.body().string();
  26. Log.i("aaa", "response1: " + string1);
  27. /**
  28. * 将json数据转换为对象
  29. */
  30. HomeadListModel model = gson.fromJson(string1, HomeadListModel.class);
  31. //HomeadListModel model2 = gson.fromJson(string1, new TypeToken<HomeadListModel>() {
  32. }.getType());
  33. /**
  34. * 将对象转换为json数据
  35. */
  36. String jsonString = gson.toJson(model);
  37. Log.i("aaa", "onResponse2: " + jsonString);
  38. for (HomeadListModel.DataBean.HomeadlistBean data : model.data.homeadlist) {
  39. mData.add(imageUrl + data.imgurl);
  40. }
  41. runOnUiThread(new Runnable() {
  42. @Override
  43. public void run() {
  44. mAdapter.notifyDataSetChanged();
  45. }
  46. });
  47. }
  48. });

我们想要将一个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)即可,下面贴上代码:

  1. OkHttpClient.Builder builder = new OkHttpClient.Builder();
  2. Request request = new Request.Builder()
  3. .url(url)
  4. .get()
  5. .build();
  6. builder.build().newCall(request).enqueue(new Callback() {
  7. @Override
  8. public void onFailure(Call call, IOException e) {
  9. }
  10. @Override
  11. public void onResponse(Call call, Response response) throws IOException {
  12. String json = response.body().string();
  13. /**
  14. * 根据json数据获取对象
  15. */
  16. HomeadListModel model = JSONObject.parseObject(json, new TypeToken<HomeadListModel>() {
  17. }.getType());
  18. // HomeadListModel model2 = JSONObject.parseObject(json, HomeadListModel.class);
  19. /**
  20. * 根据对象获取json数据
  21. */
  22. String json1 = JSONObject.toJSONString(model);
  23. Log.i("aaa", "fastJson: " + json1);
  24. for (HomeadListModel.DataBean.HomeadlistBean data : model.data.homeadlist) {
  25. mData.add(imageUrl + data.imgurl);
  26. }
  27. runOnUiThread(new Runnable() {
  28. @Override
  29. public void run() {
  30. mAdapter.notifyDataSetChanged();
  31. }
  32. });
  33. }
  34. });

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

参考博客原文地址:https://blog.csdn.net/oman001/article/details/79063278?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162665951816780255269385%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=162665951816780255269385&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-2-79063278.first_rank_v2_pc_rank_v29&utm_term=JSON%E8%A7%A3%E6%9E%90&spm=1018.2226.3001.4187

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/351696
推荐阅读
相关标签
  

闽ICP备14008679号