json解析封装

花了两个小时写的测试通过的json解析返回对象的封装,虽然很多人说gson很方便,不过我觉得自己弄清楚了用起来才灵活,希望高手能够指出问题共同进步。共享出来基本上都加了注释。


package com.angico.wts.util;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.List;

import org.json.JSONArray;
import org.json.JSONObject;

/**
* JSON数据解析类
* @author ysj
*
*/
public class JSONParse {
/**
* 解析json方法
* @param jsonStr
*/
public <T> List<T> parse(Class<T> t,String jsonStr) {
// 返回的list
List<T> list = new ArrayList<T>();
// 接收json数据的实体对象
T objT = null;
try {
// String 转成json对线
JSONObject jo = new JSONObject(jsonStr);
// 获取最外层的状态等值
int status = JsonUtility.getInteger(jo, "Info", -1);
// 如果有数据 则继续往下解析
if(true) {
// 获取list层json 数组的数据
JSONArray jsonArray = JsonUtility.getJSONArray(jo, "List");
// 通过反射获取传过来的shitibean
Field[] fields = t.getDeclaredFields();
if(jsonArray != null) {
// 如果数组不为空则循环里面的数据取出里面内容
for(int i = 0; i < jsonArray.length(); i++) {
// 实例化对象接收json的值
objT = t.newInstance();
for(Field field : fields) {
// 循环获取实体类里面的方法名 该名作为获取json的key
JSONObject obj = jsonArray.getJSONObject(i);
// 通过key获取到json里面字段的值
String value = JsonUtility.getString(obj, field.getName(), "0");
// 设置知道对象里面
setValueByName(objT,field.getName(),value);
}
// 把单个对象放到list里面
list.add((T) objT);
}
}
}
} catch (Exception e) {
System.out.println(e);
}

return list;
}

/**
* 设置值到对应的泛型对象里面
* @param object
* @param name
* @param value
*/
private static void setValueByName(Object object,String name,Object value){
// 用变量名首字母大写 拼上set就是set方法名
String methodName = "set" + Character.toUpperCase(name.charAt(0)) + name.substring(1);
try {
// 通过set方法把值设置到对象里面
object.getClass().getMethod(methodName,value.getClass()).invoke(object, value);
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值