Android JSON 数据解析之 Gson 与 Jackson 比较

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。它基于 ECMAScript 的一个子集。 JSON 采用完全独立于语言的文本格式,但是也使用了类似于 C 语言家族的习惯(包括 C、C++、C#、Java、JavaScript、Perl、Python 等)。这些特性使 JSON 成为理想的数据交换语言。

因为 Android Studio 自带的 org.json 解析 XML 文件时会将整个 XML 文件的内容解析成树型结构存放在内存中并创建新对象,比较消耗时间和内存,解析速度和效率慢,解析方式和性能完败 Gson 等开源框架,导致 org.json 已经被慢慢的淘汰,目前 Android 项目中已经很少有人使用。下面我们对于常用的 Json 解析框架 Gson 和 Jackson 进行比较。

一、Gson


Gson(又称 Google Gson),是 Google 公司 2008年5月 公开发布的一个开放源代码的 Java 库,它的主要作用是实现 Json 字符串和 Java 对象的互相转换。

下载地址:http://code.google.com/p/google-gson/

Github:https://github.com/google/gson

优点:快速高效,占内存少,灵活性高可按需解析。

  1. /**-----------------Gson数据解析----------------------------*/
  2. /**
  3. * 将Json字符串解析成对应的Java对象
  4. * @param jsonStr 需要解析的Json字符串
  5. * @param mClass 需要解析成的Java对象类型
  6. * @return 解析后的Java对象实例
  7. */
  8. public static <T> T gsonToObject(String jsonStr,Class<T> mClass)
  9. {
  10. Gson mGson = new Gson();
  11. T mt = mGson.fromJson(jsonStr, mClass);
  12. return mt;
  13. }
  14. /**
  15. * 将Json字符串解析成对应的ArrayList<T>集合
  16. * @param jsonStr 需要解析的Json字符串
  17. * @param mType 需要解析成的Java对象类型
  18. * @return mlList 解析后的ArrayList<T>集合
  19. */
  20. public static <T> ArrayList<T> gsonToListObjectOrString(String jsonStr,Type mType)
  21. {
  22. Gson mGson = new Gson();
  23. ArrayList<T> mlList = mGson.fromJson(jsonStr,mType);
  24. return mlList;
  25. }
  26. /**
  27. * 将Json字符串解析成对应的ArrayList<Map<String,T>>集合
  28. * @param jsonStr 需要解析的Json字符串
  29. * @param mType 需要解析成的Java对象类型
  30. * @return mapsList 解析后的ArrayList<Map<String,T>>集合
  31. */
  32. public static <T> ArrayList<Map<String, T>> gsonGetListMapObject(String jsonStr,Type mType)
  33. {
  34. Gson mGson = new Gson();
  35. ArrayList<Map<String, T>> mapsList = mGson.fromJson(jsonStr, mType);
  36. return mapsList;
  37. }
  38. /**
  39. * 获取需要转换的List<T>类型
  40. * @param mClass
  41. * @return mType
  42. */
  43. public static <T> Type getListType(Class<T> mClass){
  44. Type mType = null;
  45. if(mClass == Person.class){
  46. mType = new TypeToken<List<Person>>(){}.getType();
  47. }else if(mClass == String.class){
  48. mType = new TypeToken<List<String>>(){}.getType();
  49. }
  50. return mType;
  51. }
  52. /**
  53. * 获取需要转换的List<Map<String,T>>类型
  54. * @param mClass
  55. * @return mType
  56. */
  57. public static <T> Type getListMapType(Class<T> mClass){
  58. Type mType = null;
  59. if(mClass == Person.class){
  60. mType = new TypeToken<List<Map<String, Person>>>(){}.getType();
  61. }else if(mClass == String.class){
  62. mType = new TypeToken<List<Map<String, String>>>(){}.getType();
  63. }
  64. return mType;
  65. }

二、Jackson


Jackson 生于 java EE 是一个开源的 json 解析框架,提供了一个完整的框架用于将 Java 对象序列化成 Json 字符串和 XML 文档序及将 Json 字符串和 XML 文档反序列化成 Java 对象。

官网地址:http://wiki.fasterxml.com/JacksonDownload

Github:https://github.com/FasterXML/jackson

优点:更快速高效,占内存少(数据量大的时候尤为明显)。

  1. /**----------------- Jackson 数据解析----------------------------*/
  2. private static ObjectMapper mObjectMapper;
  3. private static JsonGenerator mJsonGenerator;
  4. private static ByteArrayOutputStream mOutputStream;
  5. public JsonTools()
  6. {
  7. mOutputStream = new ByteArrayOutputStream();
  8. //实例化ObjectMapper对象
  9. mObjectMapper = new ObjectMapper();
  10. try {
  11. //实例化JsonGenerator对象
  12. mJsonGenerator = mObjectMapper.getFactory().createGenerator(mOutputStream, JsonEncoding.UTF8);
  13. } catch (IOException e) {
  14. // TODO Auto-generated catch block
  15. e.printStackTrace();
  16. }
  17. }
  18. /**
  19. * 将Json字符串解析成对应的Java对象
  20. * @param jsonStr 需要解析的Json字符串
  21. * @param mClass 需要解析成的Java对象类型
  22. * @return mt 解析后的Java对象
  23. */
  24. public <T> T JacksonToObject(String jsonStr,Class<T> mClass)
  25. {
  26. T mt = null;
  27. try {
  28. mt = mObjectMapper.readValue(jsonStr, mClass);
  29. } catch (JsonParseException e) {
  30. // TODO Auto-generated catch block
  31. e.printStackTrace();
  32. } catch (JsonMappingException e) {
  33. // TODO Auto-generated catch block
  34. e.printStackTrace();
  35. } catch (IOException e) {
  36. // TODO Auto-generated catch block
  37. e.printStackTrace();
  38. }
  39. return mt;
  40. }
  41. /**
  42. * 将Json字符串解析成对应的ArrayList<T>对象
  43. * @param jsonStr 需要解析的Json字符串
  44. * @param mTypeReference 需要解析成的Java对象类型引用
  45. * @return 解析后的ArrayList<T>集合
  46. */
  47. public <T> ArrayList<T> JacksonToListObjectOrString(String jsonStr,com.fasterxml.jackson.core.type.TypeReference<T> mTypeReference)
  48. {
  49. ArrayList<T> mList = null;
  50. try {
  51. mList = mObjectMapper.readValue(jsonStr, mTypeReference);
  52. } catch (JsonParseException e) {
  53. // TODO Auto-generated catch block
  54. e.printStackTrace();
  55. } catch (JsonMappingException e) {
  56. // TODO Auto-generated catch block
  57. e.printStackTrace();
  58. } catch (IOException e) {
  59. // TODO Auto-generated catch block
  60. e.printStackTrace();
  61. }
  62. return mList;
  63. }
  64. /**
  65. * 将Json字符串解析成对应的ArrayList<Map<String,T>>对象
  66. * @param jsonStr 需要解析的Json字符串
  67. * @param mTypeReference 需要解析成的Java对象类型引用
  68. * @return 解析后的ArrayList<Map<String, T>>集合
  69. */
  70. public <T> ArrayList<Map<String, T>> JacksonToListMapObject(String jsonStr,com.fasterxml.jackson.core.type.TypeReference<T> mTypeReference)
  71. {
  72. ArrayList<Map<String, T>> mapsList = null;
  73. try {
  74. mapsList = mObjectMapper.readValue(jsonStr, mTypeReference);
  75. } catch (JsonParseException e) {
  76. // TODO Auto-generated catch block
  77. e.printStackTrace();
  78. } catch (JsonMappingException e) {
  79. // TODO Auto-generated catch block
  80. e.printStackTrace();
  81. } catch (IOException e) {
  82. // TODO Auto-generated catch block
  83. e.printStackTrace();
  84. }
  85. return mapsList;
  86. }
  87. /**
  88. * 获取需要转换的List<T>类型
  89. * @param mClass
  90. * @return
  91. */
  92. public static <T> com.fasterxml.jackson.core.type.TypeReference<T> getListTypeReference(Class<T> mClass){
  93. com.fasterxml.jackson.core.type.TypeReference mTypeReference = null;
  94. if(mClass == Person.class){
  95. mTypeReference = new com.fasterxml.jackson.core.type.TypeReference<List<Person>>() {
  96. };
  97. }else if(mClass == String.class){
  98. mTypeReference = new com.fasterxml.jackson.core.type.TypeReference<List<String>>() {
  99. };
  100. }
  101. return mTypeReference;
  102. }
  103. /**
  104. * 获取需要转换的List<Map<String,T>>类型
  105. * @param mClass
  106. * @return
  107. */
  108. public static <T> com.fasterxml.jackson.core.type.TypeReference<T> getListMapTypeReference(Class<T> mClass){
  109. com.fasterxml.jackson.core.type.TypeReference mTypeReference = null;
  110. if(mClass == Person.class){
  111. mTypeReference = new com.fasterxml.jackson.core.type.TypeReference<List<Map<String, Person>>>() {
  112. };
  113. }else if(mClass == String.class){
  114. mTypeReference = new com.fasterxml.jackson.core.type.TypeReference<List<Map<String, Person>>>() {
  115. };
  116. }
  117. return mTypeReference;
  118. }

开发包大小比较:

  1. jackson-all-1.9.0.jar 1.1 M
  2. gson-1.7.1.jar 174 KB

(完)