使用Gson解析json数据

系统管理员 2022-07-14 03:26 409阅读 0赞

Gson解析系列阅读

  • Gson使用指南
  • 使用Gson解析复杂的JSON数据
  • 使用Gson解析json数据
  • Gson全解析
  • 搞定Gson泛型封装
  • 简单新闻客户端

1. json

Json 全称 JavaScript Object Natation ,用来描述数据结构,它是基于纯文本的数据格式,是一种轻量级的数据交换格式。广泛应用于服务端与客户端的数据交互。

2. 格式

  • Json 以key-value的形式存储数据
  • Key的取值为String类型
  • Value的取值为String,boolean,Number,数组,Object,null
  • Json串以{ 开始,以 } 结尾
  • Json 串中数组是以 [ 开始,以 ] 结尾
  • Json串中Object是以 { 开始,以 } 结尾

3. 原生解析

  1. JSONObject root = new JSONObject(response);
  2. JSONArray jsonArray = root.getJSONArray("appinfo");
  3. JSONObject jsonObject = jsonArray.getJSONObject(0);
  4. String des = jsonObject.getString("des");
  5. jsonObject.optString()
  6. [
  7. {
  8. "infos": [ { "name1": "休闲", "name2": "棋牌", "name3": "益智", "url1": "image/category_game_0.jpg", "url2": "image/category_game_1.jpg", "url3": "image/category_game_2.jpg" }, { "name1": "射击", "name2": "体育", "name3": "儿童", "url1": "image/category_game_3.jpg", "url2": "image/category_game_4.jpg", "url3": "image/category_game_5.jpg" }, { "name1": "网游", "name2": "角色", "name3": "策略", "url1": "image/category_game_6.jpg", "url2": "image/category_game_7.jpg", "url3": "image/category_game_8.jpg" }, { "name1": "经营", "name2": "竞速", "name3": "", "url1": "image/category_game_9.jpg", "url2": "image/category_game_10.jpg", "url3": "" } ],
  9. "title": "游戏" },
  10. {
  11. "infos": [ { "name1": "浏览器", "name2": "输入法", "name3": "健康", "url1": "image/category_app_0.jpg", "url2": "image/category_app_1.jpg", "url3": "image/category_app_2.jpg" }, { "name1": "效率", "name2": "教育", "name3": "理财", "url1": "image/category_app_3.jpg", "url2": "image/category_app_4.jpg", "url3": "image/category_app_5.jpg" }, { "name1": "阅读", "name2": "个性化", "name3": "购物", "url1": "image/category_app_6.jpg", "url2": "image/category_app_7.jpg", "url3": "image/category_app_8.jpg" }, { "name1": "资讯", "name2": "生活", "name3": "工具", "url1": "image/category_app_9.jpg", "url2": "image/category_app_10.jpg", "url3": "image/category_app_11.jpg" }, { "name1": "出行", "name2": "通讯", "name3": "拍照", "url1": "image/category_app_12.jpg", "url2": "image/category_app_13.jpg", "url3": "image/category_app_14.jpg" }, { "name1": "社交", "name2": "影音", "name3": "安全", "url1": "image/category_app_15.jpg", "url2": "image/category_app_16.jpg", "url3": "image/category_app_17.jpg" } ],
  12. "title": "应用" }
  13. ]

json

  1. public class CategoryInfoBean {
  2. public String title; // title
  3. public String name1; // 休闲
  4. public String name2; // 棋牌
  5. public String name3; // 益智
  6. public String url1; // image/category_game_0.jpg
  7. public String url2; // image/category_game_1.jpg
  8. public String url3; // image/category_game_2.jpg
  9. public boolean isTitle; // 自己添加的一个属性,确定是否是title
  10. }
  11. List<CategoryInfoBean> categoryInfoBeans = new ArrayList<CategoryInfoBean>();
  12. try {
  13. JSONArray rootJsonArray = new JSONArray(jsonString);
  14. // 遍历jsonArray
  15. for (int i = 0; i < rootJsonArray.length(); i++) {
  16. JSONObject itemJsonObject = rootJsonArray.getJSONObject(i);
  17. String title = itemJsonObject.getString("title");
  18. CategoryInfoBean titleBean = new CategoryInfoBean();
  19. titleBean.title = title;
  20. titleBean.isTitle = true;
  21. categoryInfoBeans.add(titleBean);
  22. JSONArray infosJsonArray = itemJsonObject.getJSONArray("infos");
  23. // 遍历infosJsonArray
  24. for (int j = 0; j < infosJsonArray.length(); j++) {
  25. JSONObject infoJsonObject = infosJsonArray.getJSONObject(j);
  26. String name1 = infoJsonObject.getString("name1");
  27. String name2 = infoJsonObject.getString("name2");
  28. String name3 = infoJsonObject.getString("name3");
  29. String url1 = infoJsonObject.getString("url1");
  30. String url2 = infoJsonObject.getString("url2");
  31. String url3 = infoJsonObject.getString("url3");
  32. CategoryInfoBean infoBean = new CategoryInfoBean();
  33. infoBean.name1 = name1;
  34. infoBean.name2 = name2;
  35. infoBean.name3 = name3;
  36. infoBean.url1 = url1;
  37. infoBean.url2 = url2;
  38. infoBean.url3 = url3;
  39. categoryInfoBeans.add(infoBean);
  40. }
  41. }
  42. public List<CategoryInfo> parseData(String result) {
  43. if (!TextUtils.isEmpty(result)) {
  44. try {
  45. categoryInfoList = new ArrayList<CategoryInfo>();
  46. JSONArray jsonArray=new JSONArray(result);
  47. for (int i = 0; i < jsonArray.length(); i++) {
  48. JSONObject jsonObject=jsonArray.getJSONObject(i);
  49. CategoryInfo categoryInfo=new CategoryInfo();
  50. if (jsonObject.has("title")) {
  51. categoryInfo.setTitle(jsonObject.getString("title"));
  52. categoryInfo.setTitle(true);
  53. categoryInfoList.add(categoryInfo);
  54. }
  55. if (jsonObject.has("info")) {
  56. categoryInfo.setName1(jsonObject.getString("name1"));
  57. categoryInfo.setName2(jsonObject.getString("name2"));
  58. categoryInfo.setName3(jsonObject.getString("name3"));
  59. categoryInfo.setUrl1(jsonObject.getString("url1"));
  60. categoryInfo.setUrl1(jsonObject.getString("url2"));
  61. categoryInfo.setUrl1(jsonObject.getString("url3"));
  62. categoryInfo.setTitle(false);
  63. categoryInfoList.add(categoryInfo);
  64. }
  65. }
  66. return categoryInfoList;
  67. } catch (JSONException e) {
  68. e.printStackTrace();
  69. }
  70. }
  71. return null;
  72. }

json

4. Gson格式化

将 java 对象 格式化为 Json 字符串.

实现步骤 :

获得需要的对象:

  1. Student stu = new Student();
  2. stu.setName("张三");
  3. stu.setAge(18);
  4. stu.setSex(true);

格式化

  1. Gson gson = new Gson();
  2. //将 对象 转化成 json 字符串
  3. String json = gson.toJson(stu)

5. Gson解析

遇到[ ]就解析成集合,遇到{ }就解析成对象,遇到”“就解析成一个对应的基本数据类型

  1. {
  2. "data": [ { "children": [ { "id": 10007, "title": "北京", "type": 1, "url": "/10007/list_1.json" }, { "id": 10006, "title": "中国", "type": 1, "url": "/10006/list_1.json" }, { "id": 10008, "title": "国际", "type": 1, "url": "/10008/list_1.json" }, { "id": 10010, "title": "体育", "type": 1, "url": "/10010/list_1.json" }, { "id": 10091, "title": "生活", "type": 1, "url": "/10091/list_1.json" }, { "id": 10012, "title": "旅游", "type": 1, "url": "/10012/list_1.json" }, { "id": 10095, "title": "科技", "type": 1, "url": "/10095/list_1.json" }, { "id": 10009, "title": "军事", "type": 1, "url": "/10009/list_1.json" }, { "id": 10093, "title": "时尚", "type": 1, "url": "/10093/list_1.json" }, { "id": 10011, "title": "财经", "type": 1, "url": "/10011/list_1.json" }, { "id": 10094, "title": "育儿", "type": 1, "url": "/10094/list_1.json" }, { "id": 10105, "title": "汽车", "type": 1, "url": "/10105/list_1.json" } ], "id": 10000, "title": "新闻", "type": 1 }, { "id": 10002, "title": "专题", "type": 10, "url": "/10006/list_1.json", "url1": "/10007/list1_1.json" }, { "id": 10003, "title": "组图", "type": 2, "url": "/10008/list_1.json" }, { "dayurl": "", "excurl": "", "id": 10004, "title": "互动", "type": 3, "weekurl": "" } ],
  3. "extend": [ 10007, 10006, 10008, 10014, 10012, 10091, 10009, 10010, 10095 ],
  4. "retcode": 200 }

json

  1. /** * 网络分类信息的封装 * * 字段名字必须和服务器返回的字段名一致, 方便gson解析 * */
  2. public class NewsData {
  3. public int retcode;
  4. public ArrayList<NewsMenuData> data;
  5. // 侧边栏数据对象
  6. public class NewsMenuData {
  7. public String id;
  8. public String title;
  9. public int type;
  10. public String url;
  11. public ArrayList<NewsTabData> children;
  12. @Override
  13. public String toString() {
  14. return "NewsMenuData [title=" + title + ", children=" + children
  15. + "]";
  16. }
  17. }
  18. // 新闻页面下11个子页签的数据对象
  19. public class NewsTabData {
  20. public String id;
  21. public String title;
  22. public int type;
  23. public String url;
  24. @Override
  25. public String toString() {
  26. return "NewsTabData [title=" + title + "]";
  27. }
  28. }
  29. @Override
  30. public String toString() {
  31. return "NewsData [data=" + data + "]";
  32. }
  33. }
  34. NewsData mNewsData Gson gson = new Gson();
  35. mNewsData = gson.fromJson(result, NewsData.class);

解析结果

gson

5.1 标准解析

  1. public class GsonTools {
  2. public GsonTools() {
  3. }
  4. public static String createGsonString(Object object) {
  5. Gson gson = new Gson();
  6. String gsonString = gson.toJson(object);
  7. return gsonString;
  8. }
  9. public static <T> T changeGsonToBean(String gsonString, Class<T> cls) {
  10. Gson gson = new Gson();
  11. T t = gson.fromJson(gsonString, cls);
  12. return t;
  13. }
  14. public static <T> T changeGsonToBean(String gsonString, Type type) {
  15. Gson gson = new Gson();
  16. T t = gson.fromJson(gsonString,type);
  17. return t;
  18. }
  19. public static <T> List<T> changeGsonToList(String gsonString, Class<T> cls) {
  20. Gson gson = new Gson();
  21. List<T> list = gson.fromJson(gsonString, new TypeToken<List<T>>() {
  22. }.getType());
  23. return list;
  24. }
  25. public static <T> List<Map<String, T>> changeGsonToListMaps(String gsonString) {
  26. List<Map<String, T>> list = null;
  27. Gson gson = new Gson();
  28. list = gson.fromJson(gsonString, new TypeToken<List<Map<String, T>>>(){}.getType());
  29. return list;
  30. }
  31. public static <T> Map<String, T> changeGsonToMaps(String gsonString) {
  32. Map<String, T> map = null;
  33. Gson gson = new Gson();
  34. map = gson.fromJson(gsonString, new TypeToken<Map<String, T>>(){}.getType());
  35. return map;
  36. }
  37. }

Json的解析成 java 对象

  1. Gson gson = new Gson();
  2. // 将json 转化成 java 对象
  3. Student stu = gson.fromJson(json, Student.class);
  4. // 将 json 转化 成 List泛型
  5. List<Student> stus = gson.fromJson(json, new TypeToken<List<Student>>() {}.getType());
  6. // 将 json 转化 成 Map泛型
  7. Map<String,String> map = gson.fromJson(json, new TypeToken<Map<String,String>>() {}.getType());

5.2 泛型解析

  1. [
  2. {
  3. "des": "2005-2014 你的校园一直在这儿。中国最大的实名制SNS网络平台,大学生",
  4. "downloadUrl": "app/com.renren.mobile.android/com.renren.mobile.android.apk",
  5. "iconUrl": "app/com.renren.mobile.android/icon.jpg",
  6. "id": 1580615,
  7. "name": "人人",
  8. "packageName": "com.renren.mobile.android",
  9. "size": 21803987,
  10. "stars": 2 },
  11. {
  12. "des": "中国电信掌上营业厅是中国电信集团【官方】唯一指定服务全国电信用户的自助服务客户端",
  13. "downloadUrl": "app/com.ct.client/com.ct.client.apk",
  14. "iconUrl": "app/com.ct.client/icon.jpg",
  15. "id": 1540629,
  16. "name": "掌上营业厅",
  17. "packageName": "com.ct.client",
  18. "size": 4794202,
  19. "stars": 2 }
  20. ]

json

  1. public class AppInfoBean {
  2. public String des; // 应用的描述
  3. public String downloadUrl; // 应用的下载地址
  4. public String iconUrl; // 应用的图标地址
  5. public long id; // 应用的id
  6. public String name; // 应用的名字
  7. public String packageName; // 应用的包名
  8. public long size; // 应用的长度
  9. public float stars; // 应用的评分
  10. }
  11. public List<AppInfoBean> parseJson(String jsonString) {
  12. Gson gson = new Gson();
  13. /*=============== 泛型解析 ===============*/
  14. return gson.fromJson(jsonString, new TypeToken<List<AppInfoBean>>() {
  15. }.getType());
  16. }
  17. Type type = new TypeToken<ArrayList<String>>() {}.getType();
  18. Gson gson = new Gson();
  19. List<HomeBean> list = gson.fromJson(result,new TypeToken<List< HomeBean>>(){}.getType());
  20. Map<String,String> map = gson.fromJson(response,new TypeToken<Map<String,String>>(){}.getType());
  21. public abstract class BaseProtocol<T> {
  22. protected abstract String getInterfaceKey();
  23. protected T parseJson(String result){
  24. ParameterizedType genericSuperclass = (ParameterizedType) getClass().getGenericSuperclass();
  25. Type[] types = genericSuperclass.getActualTypeArguments();
  26. Type type = types[0];
  27. return new Gson().fromJson(result,type);
  28. }
  29. }

5.3 节点解析

适合属性比较多的情况,要啥取啥

jsonelement

json

Gson的节点对象






























节点对象 说明
JsonElement 所有的节点都是JsonElement对象
JsonPrimitive 基本的数据类型的节点对象, JsonElement的子类
JsonNull 代表空节点对象,即有key,value为空,JsonElement 的子类
JsonObject 对象 数据类型的节点对象, JsonElement的子类
JsonArray 数组 数据类型的节点对象, JsonElement的子类

5.4 JsonElement的取值

JsonPrimitive : value 的 取值对应 java

int,double,float,long,short,boolean,char,byte,String,BigDecimal,BigInteger,Number

JsonObject : value 的 取值对应 java 的 Object 对象

JsonArray : value 的 取值对应 java 的 List 及其子类对象

  1. //1、获得 解析者
  2. JsonParser parser = new JsonParser();
  3. //2、获得 根节点元素
  4. JsonElement root = parser.parse(json);
  5. //3、根据 文档判断根节点属于 什么类型的 Gson节点对象
  6. //假如文档 显示 根节点 为对象类型
  7. // 获得 根节点 的实际 节点类型
  8. JsonObject element = root.getAsJsonObject();
  9. //4、取得 节点 下 的某个节点的 value
  10. // 获得 name 节点的值,name 节点为基本数据节点
  11. JsonPrimitive nameJson = element.getAsJsonPrimitive("name");
  12. String name = nameJson.getAsString();
  13. // 获得 students 节点的值, students 节点为 数组数据节点
  14. JsonArray arrayJson = element.getAsJsonArray("students");
  15. // 获得数据 的长度
  16. int size = arrayJson.size();
  17. for(int i = 0; i < size; i++) {
  18. //获得每一个json 元素
  19. JsonElement e = arrayJson.get(i);
  20. // 通过元素 得到需要的节点值 TODO:
  21. }
  22. public List<AppInfoBean> parseJson(String jsonString) {
  23. Gson gson = new Gson();
  24. /*=============== 泛型解析 ===============*/
  25. // return gson.fromJson(jsonString, new TypeToken<List<AppInfoBean>>() {
  26. // }.getType());
  27. /*=============== 结点解析 ===============*/
  28. List<AppInfoBean> appInfoBeans = new ArrayList<AppInfoBean>();
  29. // 获得json的解析器
  30. JsonParser parser = new JsonParser();
  31. JsonElement rootJsonElement = parser.parse(jsonString);
  32. // JsonElement-->转换成jsonArray
  33. JsonArray rootJsonArray = rootJsonElement.getAsJsonArray();
  34. // 遍历jsonArray
  35. for (JsonElement itemJsonElement : rootJsonArray) {
  36. // jsonElement-->转换成JsonObject
  37. JsonObject itemJsonObject = itemJsonElement.getAsJsonObject();
  38. // 得到具体的jsonPrimitivie
  39. JsonPrimitive desPrimitivie = itemJsonObject.getAsJsonPrimitive("des");
  40. // jsonPrimitivie-->转换成具体的类型
  41. String des = desPrimitivie.getAsString();
  42. // 得到具体的jsonPrimitivie
  43. JsonPrimitive downloadUrlPrimitivie = itemJsonObject.getAsJsonPrimitive("downloadUrl");
  44. // jsonPrimitivie-->转换成具体的类型
  45. String downloadUrl = downloadUrlPrimitivie.getAsString();
  46. String iconUrl = itemJsonObject.get("iconUrl").getAsString();
  47. long id = itemJsonObject.get("id").getAsLong();
  48. String name = itemJsonObject.get("name").getAsString();
  49. String packageName = itemJsonObject.get("packageName").getAsString();
  50. long size = itemJsonObject.get("size").getAsLong();
  51. float stars = itemJsonObject.get("stars").getAsFloat();
  52. AppInfoBean info = new AppInfoBean();
  53. info.des = des;
  54. info.downloadUrl = downloadUrl;
  55. info.iconUrl = iconUrl;
  56. info.id = id;
  57. info.name = name;
  58. info.packageName = packageName;
  59. info.size = size;
  60. info.stars = stars;
  61. // 添加到集合
  62. appInfoBeans.add(info);
  63. }
  64. // 返回结果
  65. return appInfoBeans;
  66. }

com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Use JsonReader.setLenient(true) to accept malformed JSON

  1. Gson gson = new Gson();
  2. JsonReader reader = new JsonReader(new StringReader(result1));
  3. reader.setLenient(true);
  4. Userinfo userinfo1 = gson.fromJson(reader, Userinfo.class);
  5. String trimmed = result1.trim();
  6. gson.fromJson(trimmed, T);

com.google.gson.internal.LinkedTreeMap cannot be cast to com.google.smartcit

  1. public static <T> List<T> changeGsonToList(String gsonString, Class<T> cls) {
  2. Gson gson = new Gson();
  3. List<T> list = gson.fromJson(gsonString, new TypeToken<List<T>>() {
  4. }.getType());
  5. return list;
  6. }
  7. public static <T> List<T> getObjectList(String jsonString,Class<T> cls){
  8. List<T> list = new ArrayList<T>();
  9. try {
  10. Gson gson = new Gson();
  11. JsonArray arry = new JsonParser().parse(jsonString).getAsJsonArray();
  12. for (JsonElement jsonElement : arry) {
  13. list.add(gson.fromJson(jsonElement, cls));
  14. }
  15. } catch (Exception e) {
  16. e.printStackTrace();
  17. }
  18. return list;
  19. }

5.5 处理json格式特殊字符

  1. public static String changeStr(String json){
  2. json = json.replaceAll(",", ",");
  3. json = json.replaceAll(":", ":");
  4. json = json.replaceAll("\\[", "【");
  5. json = json.replaceAll("\\]", "】");
  6. json = json.replaceAll("\\{", "<");
  7. json = json.replaceAll("\\}", ">");
  8. json = json.replaceAll("\"", "”");
  9. return json.toString();
  10. }

发表评论

表情:
评论列表 (有 0 条评论,409人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Gson解析JSON

    Gson解析JSON(包含动态KEY、未知字段处理方法) 有时在解析json数据中的字段key是动态可变的时候,由于Gson是使用静态注解的方式来设置实体对象的,因此我们很难

    相关 gson解析json

    为什么使用Gson > Gson是google一个比较流行的开源项目,相比于json,Gson的功能更加全面,性能更加强大,使用方式也更加便捷简单。 一般使用Gson生

    相关 使用Gson解析json

    Java对象和Json之间的互转,一般用的比较多的两个类库是Jackson和Gson,下面记录一下Gson的学习使用。 基础概念:  Serialization:序列化,使