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