开始项目后期,要求我们将通过WebService调用的方法的复杂类型返回值改成JSON的形式。

        因为之前做过一个异构的项目,采用的数据格式就是JSON,所以这次就很沿用了上次在Android端使用的工具jar——Gson.jar。Gson是Google提供的用来在Java对象和JSON数据之间进行映射的Java类库,可以将JSON字符串和Java对象进行相互转化。

        关于JSON,大家可以看下百度百科里是怎样介绍的。总之,在传输方面,JSON比Xml更轻量。

        那么我们应该怎样用这个Gson工具呢?下面先看下我对Gson的核心功能进行的一个封装:

public class JsonUtils {
	//采取单例模式
	private static Gson gson=new Gson();
	private JsonUtils() {
	}
	/**
	 * @MethodName : toJson
	 * @Description : 将对象转为JSON串,此方法能够满足大部分需求
	 * @param src
	 *            :将要被转化的对象
	 * @return :转化后的JSON串
	 */
	public static String toJson(Object src) {
		if (src == null) {
			return gson.toJson(JsonNull.INSTANCE);
		}
		return gson.toJson(src);
	}

	/**
	 * @MethodName : fromJson
	 * @Description : 用来将JSON串转为对象,但此方法不可用来转带泛型的集合
	 * @param json
	 * @param classOfT
	 * @return
	 */
	public static <T> Object fromJson(String json, Class<T> classOfT) {
		return gson.fromJson(json, (Type) classOfT);
	}

	/**
	 * @MethodName : fromJson
	 * @Description : 用来将JSON串转为对象,此方法可用来转带泛型的集合,如:Type为 
	 *              new TypeToken<List<T>>(){}.getType()
	 *              ,其它类也可以用此方法调用,就是将List<T>替换为你想要转成的类
	 * @param json
	 * @param typeOfT
	 * @return
	 */
	public static Object fromJson(String json, Type typeOfT) {
		return gson.fromJson(json, typeOfT);
	}
}



        其实这三个方法已经足够满足你90%的需要了,至少我们项目中需要转JSON的地方使用这三个方法已经足够。


        那么,对于上面的这三个方法,应该怎样使用呢?下面看实例:

1.简单对象与JSON互转

public class Student {
	private int id;
	private String name;
	private Clazz clazz;	
}
public class Clazz {
	private int id;
	private String name;	
}
public static void obj2Json(){
	int i=1;
	Student student=new Student();
	student.setId(i);
	student.setName("学生"+i);
	Clazz clazz=new Clazz();
	clazz.setId(i);
	clazz.setName("班级"+i);
	student.setClazz(clazz);
	//将对象转成JSON
	String json=JsonUtils.toJson(student);
	System.out.println(json);
	
	//将JSON转成对象
	Student convStudent=JsonUtils.fromJson(json, Student.class);
	System.out.println(convStudent.getClazz().getName());
}



2.带泛型的集合与JSON互相转化

PS:不带泛型的集合与JSON互相转化请看1


public static void list2Json(){
	List<Student> students=new ArrayList<Student>();
	for(int i=0;i<10;i++){
		Student student=new Student();
		student.setId(i);
		student.setName("学生"+i);
		Clazz clazz=new Clazz();
		clazz.setId(i);
		clazz.setName("班级"+i);
		student.setClazz(clazz);
		students.add(student);
	}
	//将对象转成JSON
	String json=JsonUtils.toJson(students);
	System.out.println(json);
	//将JSON转成对象		
	List<Student> convStudents=JsonUtils.fromJson(json, new TypeToken<List<Student>>(){}.getType());
	for (Iterator iterator = convStudents.iterator(); iterator.hasNext();) {
		Student student = (Student) iterator.next();
		System.out.println(student.getClazz().getName());
	}
}



Map<String,Student>即可。



总结:

        那么上面到现在为止,我们到底在做一件什么样的事情呢?

        其实就相当于将一块冰移动到另外一个地,而此时只有一根管道,那么我们就将冰变成水,然后运到目的地,到目的地后,再将其转化成冰来使用(只说过程)。

        所以就算改了这些,那么我们项目中需要改变的地方只是那么一点点而已~~~