- 通过注解设置解析的参数
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface JSonPath {
public String path();
}
- 使用Java 反射机制,获取类中的方法和属性
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
/**
* 处理Jason中接收数据中数组,重复字段
* @author Administrator
*
*/
@SuppressWarnings("rawtypes")
public class JsonSuperClass {
public final boolean isDebug = true;
/**
* 读取数组中的所有类型的数据
* @param zlass
* @param clist
* @return
*/
private List<Class> getMySuperClasses(Class zlass,List<Class> clist){
clist.add(zlass);
Class mClass=zlass.getSuperclass();
if(mClass.getName().equalsIgnoreCase("java.lang.Object"))
{
clist.add(mClass);
return clist;
}
else{
return getMySuperClasses(mClass, clist);
}
}
protected List<Field> getAllField(Class mClass)
{
//There can't be a duplicate name
List<Field> mField=new ArrayList<Field>();
Set<String> mString=new HashSet<String>();
List<Class> mSuperClass=getMySuperClasses(mClass, new ArrayList<Class>());
for(int i=0;i<mSuperClass.size();i++)
{
Class mSubClass = mSuperClass.get(i);
Field[] fields= mSubClass.getDeclaredFields();
addAllOutSameName(mField, mString, fields);
}
return mField;
}
/**
* 剔除重复的值
* @param mAllField
* @param mSet
* @param mField
*/
private void addAllOutSameName(List<Field> mAllField, Set<String> mSet,
Field[] mField) {
// TODO Auto-generated method stub
for(int i=0;i<mField.length;i++)
{
String name=mField[i].getName();
if(mSet.contains(name))
{
continue;
}
else{
mAllField.add(mField[i]);
mSet.add(name);
}
}
}
/**
* read jason array
* @param mField
* @return
*/
protected Field[] mFieldArray(List<Field> mField)
{
Field[] mSubField = new Field[mField.size()];
for(int i=0;i<mField.size();i++)
{
mSubField[i]=mField.get(i);
}
return mSubField;
}
}
import android.annotation.SuppressLint;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.util.ArrayList;
import java.util.List;
public class JsonParser extends JsonSuperClass{
public JsonParser()
{
}
public Object Parser(String mString, Class<?> mClass)
{
JSONObject mObj=null;
try {
mObj=new JSONObject(mString);
} catch (JSONException e) {
if(isDebug)
System.out.println("-->class JsonParser line 28 \t"+e.getMessage());
}
return Parser(mObj,mClass);
}
@SuppressLint("NewApi")
public Object Parser(JSONObject mObj,Class<?> mClass)
{
Object mObject =null;
try {
mObject= mClass.newInstance();
} catch (InstantiationException | IllegalAccessException e) {
if(isDebug)
System.err.println("-->class JsonParser line 41\t没有默认的构造函数,或者构造函数的访问权限不是公共的"+e.getMessage());
return null;
}
Field[] mField = mFieldArray(getAllField(mClass));
for(Field field:mField)
{
field.setAccessible(true);
if(field.isAnnotationPresent(JSonPath.class))
{
JSonPath mAnnotation = field.getAnnotation(JSonPath.class);
String mJSonKey = mAnnotation.path();//元注释
Class<?> mSubClass = field.getType();
/*类的反射机制(在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象
*,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。)*/
if(mSubClass.equals(Long.class)|| "long".equalsIgnoreCase(mSubClass.getName()))
{
try {
long mlong=mObj.getLong(mJSonKey);
field.setLong(mObject, mlong);
} catch (JSONException e) {
if(isDebug)
System.out.println("-->class JsonParser line 62 未获取数据:\t"+e.getMessage());
} catch (IllegalAccessException e) {
if(isDebug)
System.out.println("-->class JsonParser line 65 Field获取对象非公有异常"+e.getMessage());
} catch (IllegalArgumentException e) {
if(isDebug)
System.out.println("-->class JsonParser line 68 反射机制中设置的参数异常"+e.getMessage());
}
}
else if(mSubClass.equals(Integer.class) || "int".equalsIgnoreCase(mSubClass.getName()))
{
try {
int mInt=mObj.getInt(mJSonKey);
field.setInt(mObject, mInt);
} catch (JSONException e) {
if(isDebug)
System.out.println("-->class JsonParser line 78\t未获取数据"+e.getMessage());
} catch (IllegalAccessException e) {
if(isDebug)
System.out.println("-->class JsonParser line 82 Field获取对象非公有异常"+e.getMessage());
} catch (IllegalArgumentException e) {
if(isDebug)
System.out.println("-->class JsonParser line 84 反射机制中设置的参数异常"+e.getMessage());
}
}
else if(mSubClass.equals(String.class))
{
try {
String mString=mObj.getString(mJSonKey);
field.set(mObject,mString);
} catch (JSONException e) {
if(isDebug)
System.out.println("-->class JsonParser line 94\t未获取数据"+e.getMessage());
try {
field.set(mObject, null);
} catch (Exception e1) {
if(isDebug)
System.out.println("-->class JsonParser line 99\t"+e.getMessage());
}
} catch (IllegalAccessException e) {
if(isDebug)
System.out.println("-->class JsonParser line 103 Field获取对象非公有异常"+e.getMessage());
} catch (IllegalArgumentException e) {
if(isDebug)
System.out.println("-->class JsonParser line 106 反射机制中设置的参数异常"+e.getMessage());
}
}
else if(mSubClass.equals(java.util.List.class))
{
Class<?> mListClass =null;
mListClass = getListFieldItemClass(field);
try {
JSONArray mArray=mObj.getJSONArray(mJSonKey);
List<?> mList= ParserArray(mArray, mListClass);
field.set(mObject, mList);
} catch (JSONException e) {
if(isDebug)
System.out.println("-->class JsonParser line 120\t未获取数据"+e.getMessage());
} catch (IllegalAccessException e) {
if(isDebug)
System.out.println("-->class JsonParser line 123 Field获取对象非公有异常"+e.getMessage());
} catch (IllegalArgumentException e) {
if(isDebug)
System.out.println("-->class JsonParser line 126 反射机制中设置的参数异常"+e.getMessage());
}
}
}
}
return mObject;
}
/**
* 获取超类的实际类型
* @param field
* @return
*/
@SuppressWarnings("rawtypes")
private Class<?> getListFieldItemClass(Field field)
{
//String mString = field.getGenericType().toString();//返回泛型类型的定义
//System.out.println("-->class JsonParser line 124 \t "+mString);
/*
* 参数化类型在反射方法首次需要时创建(在此包中指定)。
* 当创建参数化类型 p 时,p 实例化的一般类型声明会被解析,并且按递归方式创建 p 的所有类型参数
* 类型变量:ParameterizedType 表示参数化类型,
* TypeVariable 是各种类型变量的公共高级接口
*/
ParameterizedType mType=(ParameterizedType) field.getGenericType();
Class mClass =(Class) mType.getActualTypeArguments()[0];
//System.out.println("-->class JsonParser line 133\t"+mClass.getName());
return mClass;
}
/**
* 将对应类型的数据存入到数组中
* @param mArray
* @param mClass
* @return
*/
@SuppressWarnings({ "unchecked", "rawtypes" })
private List ParserArray(JSONArray mArray, Class mClass)
{
List mSubList=null;
int mIndex=0;
if(mClass.equals(Long.class) || "long".equalsIgnoreCase(mClass.getName()))
{
mSubList = new ArrayList<Long>();
mIndex = 1;
}
else if(mClass.equals(Integer.class ) || "int".equalsIgnoreCase(mClass.getName()))
{
mSubList = new ArrayList<Integer>();
mIndex = 2;
}
else if(mClass.equals(String.class))
{
mSubList = new ArrayList<String>();
mIndex = 3;
}
else
{
mSubList = new ArrayList<Object>();
mIndex =4;
}
for(int i=0;i<mArray.length();i++)
{
try{
switch(mIndex)
{
case 1:
mSubList.add(mArray.getLong(i));
break;
case 2:
mSubList.add(mArray.getInt(i));
break;
case 3:
mSubList.add(mArray.getString(i));
break;
case 4:
try{
JSONObject mJsonObj = mArray.getJSONObject(i);
Object mObj= Parser(mJsonObj, mClass);
mSubList.add(mObj);
}catch(Exception e)
{
if(isDebug)
System.err.println("-->class JsonParser line 209\tjson解析异常"+e.getMessage());
break;
}
break;
default :
break;
}
}catch(Exception e)
{
if(isDebug)
System.out.println("-->class JsonParser line 219\t数据未获取到"+e.getMessage());
}
}
return mSubList;
}
}
3.测试案例
如创建User 类 ,那么解析的数据可以为
String mJsonStr = "{name:\"tom\",age:23}";
JsonParser mJsontool = new JsonParser ();
User u = (User) mJsontool.Parser((String)mJsonStr, User.class);
System.out.println(u);
这是测试类
public class User {
@JSonPath(path = "name")
private String name;
@JSonPath(path = "age")
private int age;
@Override
public String toString() {
return "User [name=" + name + ", age=" + age + "]";
}
}
记得需要
org.json.JSONObject 这个包