开始项目后期,要求我们将通过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>即可。
总结:
那么上面到现在为止,我们到底在做一件什么样的事情呢?
其实就相当于将一块冰移动到另外一个地,而此时只有一根管道,那么我们就将冰变成水,然后运到目的地,到目的地后,再将其转化成冰来使用(只说过程)。
所以就算改了这些,那么我们项目中需要改变的地方只是那么一点点而已~~~