Json与Java对象互转之Gson学习

请尊重他人的劳动成果,转载请注明出处: Json与Java对象互转之Gson学习

我曾在《XML,Object,Json转换之浅析Xstream的使用》一文中介绍过使用XStream进行XML,Object,Json之间的转换,虽然XStream内置了对Json的支持,但是效果不是特别好,毕竟XStream重点不在Json。下面就介绍另外一种工具。

Gson(又称Google Gson)是Google公司发布的一个开放源代码的Java库,主要用途为串行化Java对象为JSON字符串,或反串行化JSON字符串成Java对象。

1.如何使用Gson?

首先从http://code.google.com/p/google-gson/downloads/list上下载Gson的jar包,然后将其导入到项目中。然后,就可以在你的项目中使用Gson了。

2.主要方法

Gson的应用主要为toJsonfromJson两个转换方法,而在使用这种对象转换之前需先创建好对象的类以及其成员才能成功的将JSON字符串成功转换成相对应的对象。

3. Gson的应用实例

  1. /**
  2. * 使用Gson实现对象,Json互转
  3. * @author jph
  4. * Date:2014.09.29
  5. */
  6. public class GsonUtil {
  7. public static Gson gson;
  8. /**Json转JavaBean**/
  9. public static final int JSON_JAVABEAN=0x10001;
  10. /**Json转List<T>**/
  11. public static final int JSON_LIST=0x10002;
  12. /**Json转Map<T>**/
  13. public static final int JSON_MAP=0x10004;
  14. /**
  15. * 将对象转换成Json格式的字符串
  16. * @param object 要转换成Json的对象
  17. * @return String:Json格式的字符串
  18. */
  19. public static String convertObject2Json(Object object) {
  20. gson=new Gson();
  21. return gson.toJson(object);
  22. }
  23. /**
  24. * 将Json转换成Java对象
  25. * @param inputStream 要转换成Java对象的inputStream
  26. * @param javaBean List获取Map中所包含的javaBean
  27. * @param convertFlag 转换类型标识
  28. * @return Object:Java对象
  29. */
  30. public static Object convertJson2Object(InputStream inputStream,Class<?>javaBean ,int convertFlag) {
  31. gson=new Gson();
  32. Object object=null;
  33. // String json=inputStream2String(inputStream);
  34. BufferedReader reader=intputStream2BufferedReader(inputStream);
  35. Type type=getType(javaBean,convertFlag);
  36. object=gson.fromJson(reader,type);
  37. return object;
  38. }
  39. /**
  40. * 获取要转换成的对象类型
  41. * @param javaBean
  42. * @param convertFlag
  43. * @return
  44. */
  45. private static Type getType(Class<?> javaBean,int convertFlag) {
  46. Type type=null;
  47. switch (convertFlag) {
  48. case JSON_LIST:
  49. if (javaBean.equals(News.class)) {//Json转List泛型
  50. type=new TypeToken<List<News>>(){}.getType();
  51. }
  52. break;
  53. case JSON_MAP:
  54. if (javaBean.equals(News.class)) {//Json转Map泛型
  55. type=new TypeToken<Map<String,News>>(){}.getType();
  56. }
  57. break;
  58. case JSON_JAVABEAN://Json转JavaBean
  59. type=javaBean;
  60. break;
  61. }
  62. return type;
  63. }
  64. /**
  65. * 将InputStream封装成BufferedReader
  66. * @param inputStream
  67. * @return
  68. */
  69. private static BufferedReader intputStream2BufferedReader(InputStream inputStream) {
  70. return new BufferedReader(new InputStreamReader(inputStream));
  71. }
  72. }

代码分析:

在将Json转换成对象的时候,上面代码是从服务器端获取输入流,然后将输入流封装成BufferedReader对象,然后通过fromJson()方法将Json转换成Java对象。

Gson的fromJson()方法的第一个参数支持String、JsonElement和Reader类型的参数,可以根据需要进行选择。fromJson()方法的第二个参数支持Type和Class<?>类型的参数,当将Json转成JavaBean时可以使用Class<?>参数,也就是用对应JavaBean的JavaBean.calss作为第二个参数。当需要将Json转出成List泛型,Map泛型的时候需要采用TypeToken将第二个参数转换成Type类型(TypeToken是gson提供的数据类型转换器,可以支持各种数据集合类型转换。)。