自定义Json解析工具
此博客为博主原创文章,转载请标明出处,维权必究:https://www.cnblogs.com/tangZH/p/10689536.html
更多精彩文章:http://77blogs.com/?p=301
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集合或者ArrayList
if (pt.getRawType().equals(List.class) || pt.getRawType().equals(ArrayList.class)) {
//那么它对应在json中的是一个jsonArray
JSONArray array = object.getJSONArray(helper.name);
//如果集合里面的泛型为String
if (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;
}
自定义Json解析工具的更多相关文章
- Json解析工具Jackson(使用注解)--jackson框架自定义的一些json解析注解
Json解析工具Jackson(使用注解)--jackson框架自定义的一些json解析注解 @JsonIgnoreProperties 此注解是类注解,作用是json序列化时将Javabean中的一 ...
- Json解析工具Jackson(使用注解)
原文http://blog.csdn.net/nomousewch/article/details/8955796 接上一篇文章Json解析工具Jackson(简单应用),jackson在实际应用中给 ...
- Gson json解析工具
json 解析工具 ,谷歌出品 对象转换字符串 HashMap<String,String> hashMap = new HashMap<String, String>(); ...
- JSON 解析工具的封装(Java)
JSON 解析工具的封装(Java) 一直想有一个属于自己的JSON工具,今天终于弄好了..... 1.添加pom依赖包 <!--json解析--> <dependency> ...
- java后台常用json解析工具问题小结
若排版紊乱可查看我的个人博客原文地址 java后台常用json解析工具问题小结 这里不细究造成这些问题的底层原因,只是单纯的描述我碰到的问题及对应的解决方法 jackson将java对象转json字符 ...
- JSON解析工具比较,主要GSON和FastJSON
JSON解析工具比较,主要GSON和FastJSON 一 .各个JSON技术的简介和优劣 1.json-lib json-lib最开始的也是应用最广泛的json解析工具,json-lib 不好的地方确 ...
- [转] 各种Json解析工具比较 - json-lib/Jackson/Gson/FastJson
JSON技术的调研报告 一 .各个JSON技术的简介和优劣1.json-libjson-lib最开始的也是应用最广泛的json解析工具,json-lib 不好的地方确实是依赖于很多第三方包,包括com ...
- JSON解析工具-org.json使用教程
转自:http://www.open-open.com/lib/view/open1381566882614.html 一.简介 org.json是Java常用的Json解析工具,主要提供JSONO ...
- Java:JSON解析工具-org.json
一.简介 org.json是Java常用的Json解析工具,主要提供JSONObject和JSONArray类,现在就各个类的使用解释如下. 二.准备 1.在使用org.json之前,我们应该先从该网 ...
随机推荐
- WBS 与 甘特图
WBS:工作分解结构(Work Breakdown Structure) 创建WBS:创建WBS是把项目 交付成果和项目工作分解成较小的,更易于管理的组成部分的过程. WBS是项目管理重要的专业术语之 ...
- Spring @Conditional注解的使用
Spring Boot的强大之处在于使用了Spring 4框架的新特性:@Conditional注释,此注释使得只有在特定条件满足时才启用一些配置. 下面来介绍如何使用Condition 首先写一个类 ...
- PAT1126:Eulerian Path
1126. Eulerian Path (25) 时间限制 300 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue In grap ...
- String的trim()用于去掉字符串前后的空格
String的trim()可以去掉字符串的前导和后继字符串,即去掉字符串前面和后面的空格. eg:String userName = " good man "; System.ou ...
- Python并发编程之从生成器使用入门协程(七)
大家好,并发编程 进入第七篇. 从今天开始,我们将开始进入Python的难点,那就是协程. 为了写明白协程的知识点,我查阅了网上的很多相关资料.发现很难有一个讲得系统,讲得全面的文章,导致我们在学习的 ...
- ucloud mysql
[root@--- bin]# yum install mysql-server Loaded plugins: fastestmirror Setting up Install Process Lo ...
- c#Socket客户端和服务端的信息发送
这是我制作的界面信息,c# Socket通信的简单使用,刚开始学习,不对的地方请大家指教,目前是可以运行的,之后自己在慢慢添加新的东西.同时了解Tcp协议的三次握手.希望对跟我一样的初学者有所帮助. ...
- springboot集成schedule(深度理解)
背景 在项目开发过程中,我们经常需要执行具有周期性的任务.通过定时任务可以很好的帮助我们实现. 我们拿常用的几种定时任务框架做一个比较: 从以上表格可以看出,Spring Schedule框架功能完善 ...
- app与手机其他软件交互测试
针对智能终端应用的服务等级划分方式及实时特性所提出的测试方法.交叉测试又叫事件或冲突测试,是指一个功能正在执行过程中,同时另外一个事件或操作对该过程进行干扰的测试.如:App在前/后台运行状态时与来电 ...
- Android FoldingLayout 折叠布局 原理及实现(二)
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/44283093,本文出自:[张鸿洋的博客] 1.概述 在上一篇Android Fo ...