此博客为博主原创文章,转载请标明出处,维权必究:https://www.cnblogs.com/tangZH/p/10689536.html

fastjson是很好用的json解析工具,只可惜项目中要求apk体积尽量小,所以并不打算引入fastJson,只好自己写一个,遗憾的是写出的这个并没法解析所有的json数据,不过还是很值得学习的,且听我一一道来。

主要实现两个功能:

1、将jsonArray解析为List

2、将json数据转化为class

当然,class里面的成员变量的名称需要与json里面的key一样。

思路:

1、通过反射获取class类里面的成员变量名称以及类型

2、通过成员变量的名称与类型去json数据中获取该key对应的value

2、将value通过反射赋值给class对象。

具体且看:

1、定义一个实体类保存class里面的反射获取到的每个成员变量对应字段,名称,类型

static class ValueHelper {String name;String type;Field field;}

2、将json数据转换为实体类

 public static <T> T parseJson2Obj(String data, Class<T> tClass) {if (TextUtils.isEmpty(data))return null;try {List<ValueHelper> listKey;//获得自己的所有属性Field[] fields = tClass.getFields();if (null == fields)return null;listKey = new ArrayList<>();for (Field field : fields) {ValueHelper helper = new ValueHelper();helper.name = field.getName();helper.type = field.getGenericType().toString();helper.field = field;listKey.add(helper);}//将所有的属性保存在keyList集合中            //实例化给实体类,以便对其进行反射赋值Object c = tClass.newInstance();JSONObject object = new JSONObject(data);for (int j = 0; j < listKey.size(); j++) {ValueHelper helper = listKey.get(j);//取出实体类中的属性,根据名称与类型去jsonObject中取值,                //具体实现接下来会讲Object o = getJsonValue(helper, object);//赋值给该实体类,具体实现记下来会讲setProperty(c, helper.field, o);}//返回该实体类return (T) c;} catch (InstantiationException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();} catch (JSONException e) {e.printStackTrace();}return null;}

2.1 取出实体类中的属性,根据名称与类型去jsonObject中取值

public static Object getJsonValue(ValueHelper helper, JSONObject object) throws JSONException {switch (helper.type) {case "class java.lang.String":return object.optString(helper.name, "");case "class java.lang.Integer":case "int":return object.optInt(helper.name, 0);case "class java.lang.Double":return object.optDouble(helper.name, 0);case "class java.lang.Boolean":return object.optBoolean(helper.name, false);}//如果该成员变量是泛型if (helper.field.getGenericType() instanceof ParameterizedType) {ParameterizedType pt = (ParameterizedType) helper.field.getGenericType();//判断具体类的类型,list集合或者ArrayListif (pt.getRawType().equals(List.class) || pt.getRawType().equals(ArrayList.class)) {//那么它对应在json中的是一个jsonArrayJSONArray array = object.getJSONArray(helper.name);//如果集合里面的泛型为Stringif (pt.getActualTypeArguments()[0].equals(String.class)) {//将该jsonArray转化为list,具体实现接下来会讲,                    //其实就相当于多次执行json转化为class,然后放入list中                    //如果泛型参数为class实体类,那我就不知道该怎么解析了,                    //不知道怎么判断里面的泛型参数是否为实体类                    //这也是我所说的没法解析所有的json数据List<String> sList = JsonArrayToList(array);return sList;}}}return null;}

2.2 给实体类赋值

public static void setProperty(Object c, Field field, Object value)throws SecurityException,IllegalArgumentException, IllegalAccessException {if (null == c || null == value)return;// 取消访问检查(私有成员变量的时候需要)field.setAccessible(true);// 给对象的成员变量赋值为指定的值--->value
        field.set(c, value);}

2.3 JsonArrayToList方法

public static <T> List<T> JsonArrayToList(JSONArray ja) {List<T> ret = new ArrayList();if (ja == null) {return ret;} else {for(int i = 0; i < ja.length(); ++i) {try {Object obj = ja.get(i);if (obj != null) {ret.add(obj);}} catch (JSONException var4) {;}}return ret;}}

3、将jsonArray转为list<class>,注意参数json是jsonArray数据,原理类似,就不再多讲

public static <T> List<T> parseJsonArray2List(String json, Class<? extends T> aClass) {//反射获取所有public字段,包括父类List<T> list = null;List<ValueHelper> listKey;try {JSONArray array = new JSONArray(json);if (null == array)return list;//获得自己的所有属性Field[] fields = aClass.getFields();if (null == fields)return null;listKey = new ArrayList<>();for (Field field : fields) {ValueHelper helper = new ValueHelper();helper.name = field.getName();helper.type = field.getGenericType().toString();helper.field = field;listKey.add(helper);}list = new ArrayList<>();for (int i = 0; i < array.length(); i++) {JSONObject object = array.getJSONObject(i);Object c = aClass.newInstance();for (int j = 0; j < listKey.size(); j++) {ValueHelper helper = listKey.get(j);Object o = getJsonValue(helper, object);setProperty(c, helper.field, o);}list.add((T) c);}} catch (JSONException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();} catch (InstantiationException e) {e.printStackTrace();}return list;}

转载于:https://www.cnblogs.com/tangZH/p/10689536.html

自定义Json解析工具相关推荐

  1. java 自定义json解析注解 复杂json解析 工具类

    java 自定义json解析注解 复杂json解析 工具类 目录 java 自定义json解析注解 复杂json解析 工具类 1.背景 2.需求-各式各样的json 一.一星难度json[json对象 ...

  2. Json解析工具Jackson(使用注解)

    接上一篇文章Json解析工具Jackson(简单应用),jackson在实际应用中给我们提供了一系列注解,提高了开发的灵活性,下面介绍一下最常用的一些注解 @JsonIgnoreProperties ...

  3. Java常用的几种JSON解析工具

    一.Gson:Google开源的JSON解析库 1.添加依赖 <!--gson--> <dependency><groupId>com.google.code.gs ...

  4. 一文吃透Json解析工具类合集(FastJson、Jackson、Gson)

    Json解析工具类 前言 一.各个JSON技术的简介 1.1 FastJson角色 1.2 Jackson角色 1.3 Gson角色 二.使用步骤 2.1 引入库 1.FastJson依赖 2.Jac ...

  5. JSON解析工具比较,主要GSON和FastJSON

    转自:http://www.cnblogs.com/kunpengit/p/4001680.html 一 .各个JSON技术的简介和优劣 1.json-lib json-lib最开始的也是应用最广泛的 ...

  6. Java:JSON解析工具-org.json

    一.简介 org.json是Java常用的Json解析工具,主要提供JSONObject和JSONArray类,现在就各个类的使用解释如下. 二.准备 1.在使用org.json之前,我们应该先从该网 ...

  7. json解析工具(json解析工具 python)

    常用的xml,json解析工具有哪些 1.定义介绍 (1).XML定义 扩展标记语言 (Extensible Markup Language, XML) ,用于标记电子文件使其具有结构性的标记语言,可 ...

  8. FastJson快速上手【Json解析工具】

    目录 一.spring boot工程中引入FastJson依赖 二.调用JSON类的静态方法直接进行json序列化和反序列化 2.1 序列化 2.2 反序列化 三.快速演示: 四.思考 五.web案例 ...

  9. [Android开发] Json解析工具类,一个类搞定Json的解析

    一.简介 利用递归的方式反射解析到bean里面 二.详细代码 1. Json格式 例如服务器指定规定json格式为: {"code": "--" , // 返回 ...

最新文章

  1. maven构建本地jar包到本地仓库
  2. 还原JavaScript的真实历史~
  3. pyqt5 listview 不默认选中_pyqt5 商店小票打印的实现模板
  4. 基于E18-2G4U04B的ZigBee3.0无线数据抓包安装方法
  5. TensorFlow实验(2)
  6. php string常用函数
  7. MAC版CRT使用心得
  8. geforce experience不能登录_青椒第二课堂禁毒平台|官方网站登录
  9. java模拟双向链表实现
  10. Redis 数据类型及应用场景
  11. 2021【第十二届蓝桥杯省赛】 C/C++ B组(第二场)
  12. paip.提升安全性----软键盘的弱点
  13. 怎样用计算机制作漫画,用电脑绘制漫画需要些什么?步骤是什么?
  14. Excel数据可视化表盘模板
  15. 我所理解的协方差矩阵
  16. Marlin固件 ---- G_Code 命令解析
  17. 数据分析实战(二) 基于美国人口adult数据集R语言分析实战
  18. 目标跟踪(4)使用dlib进行对象跟踪
  19. 用JavaScript实现,用户输入自己的汽油编号,然后输入自己加多少升,就弹出价格
  20. 华信mysql数据恢复_华信安卓手机数据恢复程序3.0

热门文章

  1. 循环首次适应算法_遗传算法 | 了解底层, 摆脱工具箱
  2. MyBatis学习02
  3. Linux管理员权限失败su Authentication failure
  4. 响应已被截断_技术:RWD响应式网站网页设计基本原则
  5. python测试代码运行时间_在Python中准确地测量代码执行时间
  6. python指定返回类型_如何在python中指定方法返回类型列表 - python
  7. python培训周末线下班_现在学习Python2还是python3?老男孩Python线下班
  8. neo4j 查询同一节点的两个上级_链表的魅力:两个单向链表的第一个交点
  9. 沃嘉工业机器人及自动化_智能制造和工业自动化的新宠儿——工业机器人
  10. pandas rolling方法_Pandas处理时间序列数据的20个关键知识点