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 block
e.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 block
e.printStackTrace();
} catch (JsonMappingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.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 block
e.printStackTrace();
} catch (JsonMappingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.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 block
e.printStackTrace();
} catch (JsonMappingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.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 M
gson-1.7.1.jar 174 KB
(完)