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
优点:快速高效,占内存少,灵活性高可按需解析。
/**-----------------Gson数据解析----------------------------*//*** 将Json字符串解析成对应的Java对象* @param jsonStr 需要解析的Json字符串* @param mClass 需要解析成的Java对象类型* @return 解析后的Java对象实例*/public static <T> T gsonToObject(String jsonStr,Class<T> mClass){Gson mGson = new Gson();T mt = mGson.fromJson(jsonStr, mClass);return mt;}/*** 将Json字符串解析成对应的ArrayList<T>集合* @param jsonStr 需要解析的Json字符串* @param mType 需要解析成的Java对象类型* @return mlList 解析后的ArrayList<T>集合*/public static <T> ArrayList<T> gsonToListObjectOrString(String jsonStr,Type mType){Gson mGson = new Gson();ArrayList<T> mlList = mGson.fromJson(jsonStr,mType);return mlList;}/*** 将Json字符串解析成对应的ArrayList<Map<String,T>>集合* @param jsonStr 需要解析的Json字符串* @param mType 需要解析成的Java对象类型* @return mapsList 解析后的ArrayList<Map<String,T>>集合*/public static <T> ArrayList<Map<String, T>> gsonGetListMapObject(String jsonStr,Type mType){Gson mGson = new Gson();ArrayList<Map<String, T>> mapsList = mGson.fromJson(jsonStr, mType);return mapsList;}/*** 获取需要转换的List<T>类型* @param mClass* @return mType*/public static <T> Type getListType(Class<T> mClass){Type mType = null;if(mClass == Person.class){mType = new TypeToken<List<Person>>(){}.getType();}else if(mClass == String.class){mType = new TypeToken<List<String>>(){}.getType();}return mType;}/*** 获取需要转换的List<Map<String,T>>类型* @param mClass* @return mType*/public static <T> Type getListMapType(Class<T> mClass){Type mType = null;if(mClass == Person.class){mType = new TypeToken<List<Map<String, Person>>>(){}.getType();}else if(mClass == String.class){mType = new TypeToken<List<Map<String, String>>>(){}.getType();}return mType;}
二、Jackson
Jackson 生于 java EE 是一个开源的 json 解析框架,提供了一个完整的框架用于将 Java 对象序列化成 Json 字符串和 XML 文档序及将 Json 字符串和 XML 文档反序列化成 Java 对象。
官网地址:http://wiki.fasterxml.com/JacksonDownload
Github:https://github.com/FasterXML/jackson
优点:更快速高效,占内存少(数据量大的时候尤为明显)。
/**----------------- Jackson 数据解析----------------------------*/private static ObjectMapper mObjectMapper;private static JsonGenerator mJsonGenerator;private static ByteArrayOutputStream mOutputStream;public JsonTools(){mOutputStream = new ByteArrayOutputStream();//实例化ObjectMapper对象mObjectMapper = new ObjectMapper();try {//实例化JsonGenerator对象mJsonGenerator = mObjectMapper.getFactory().createGenerator(mOutputStream, JsonEncoding.UTF8);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}/*** 将Json字符串解析成对应的Java对象* @param jsonStr 需要解析的Json字符串* @param mClass 需要解析成的Java对象类型* @return mt 解析后的Java对象*/public <T> T JacksonToObject(String jsonStr,Class<T> mClass){T mt = null;try {mt = mObjectMapper.readValue(jsonStr, mClass);} catch (JsonParseException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (JsonMappingException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}return mt;}/*** 将Json字符串解析成对应的ArrayList<T>对象* @param jsonStr 需要解析的Json字符串* @param mTypeReference 需要解析成的Java对象类型引用* @return 解析后的ArrayList<T>集合*/public <T> ArrayList<T> JacksonToListObjectOrString(String jsonStr,com.fasterxml.jackson.core.type.TypeReference<T> mTypeReference){ArrayList<T> mList = null;try {mList = mObjectMapper.readValue(jsonStr, mTypeReference);} catch (JsonParseException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (JsonMappingException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}return mList;}/*** 将Json字符串解析成对应的ArrayList<Map<String,T>>对象* @param jsonStr 需要解析的Json字符串* @param mTypeReference 需要解析成的Java对象类型引用* @return 解析后的ArrayList<Map<String, T>>集合*/public <T> ArrayList<Map<String, T>> JacksonToListMapObject(String jsonStr,com.fasterxml.jackson.core.type.TypeReference<T> mTypeReference){ArrayList<Map<String, T>> mapsList = null;try {mapsList = mObjectMapper.readValue(jsonStr, mTypeReference);} catch (JsonParseException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (JsonMappingException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}return mapsList;}/*** 获取需要转换的List<T>类型* @param mClass* @return*/public static <T> com.fasterxml.jackson.core.type.TypeReference<T> getListTypeReference(Class<T> mClass){com.fasterxml.jackson.core.type.TypeReference mTypeReference = null;if(mClass == Person.class){mTypeReference = new com.fasterxml.jackson.core.type.TypeReference<List<Person>>() {};}else if(mClass == String.class){mTypeReference = new com.fasterxml.jackson.core.type.TypeReference<List<String>>() {};}return mTypeReference;}/*** 获取需要转换的List<Map<String,T>>类型* @param mClass* @return*/public static <T> com.fasterxml.jackson.core.type.TypeReference<T> getListMapTypeReference(Class<T> mClass){com.fasterxml.jackson.core.type.TypeReference mTypeReference = null;if(mClass == Person.class){mTypeReference = new com.fasterxml.jackson.core.type.TypeReference<List<Map<String, Person>>>() {};}else if(mClass == String.class){mTypeReference = new com.fasterxml.jackson.core.type.TypeReference<List<Map<String, Person>>>() {};}return mTypeReference;}
开发包大小比较:
jackson-all-1.9.0.jar 1.1 Mgson-1.7.1.jar 174 KB
(完)