Android开发中遇到的Json数据解析,本人用过系统提供的解析,也用过阿里提供的fastJson、第三方的Gson和JackJson.但是对于那种解析最好用,我表示还是那么小白,今日看了一篇大牛博文,分析了这几种解析的性能比较,JackJson的消耗时间是最短的。我便重新整理了这方面的知识,有了以下一个工具类JackJsonFactory.java:
import java.io.IOException;
import java.util.ArrayList;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.type.TypeReference;
@SuppressWarnings("unchecked")
public class JackJsonFactory {
private static JackJsonFactory mJackJsonFactory;
private ObjectMapper mObjectMapper;
public JackJsonFactory(){
mObjectMapper=new ObjectMapper();
}
public static JackJsonFactory getInstance(){
if(mJackJsonFactory==null){
synchronized (JackJsonFactory.class) {
if(mJackJsonFactory==null){
mJackJsonFactory=new JackJsonFactory();
}
}
}
return mJackJsonFactory;
}
public String toJson(Object mObject){
String result="";
try {
result=mObjectMapper.writeValueAsString(mObject);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return result;
}
public <T> T fromJson(String json,T t){
T result=null;
try {
result=(T) mObjectMapper.readValue(json, t.getClass());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return result;
}
public <T> ArrayList<T> fromJsonList(String json,TypeReference<ArrayList<T>> mTypeReference){
ArrayList<T> result=null;
try {
result=mObjectMapper.readValue(json, mTypeReference);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return result;
}
}
当然也有不少人对Gson坚贞不移,不过在泛型解析这块可能会遇到以下问题:com.google.gson.internal.LinkedTreeMap cannot be cast to test.UserBean at t..下面是相关的解析办法:
public <T> ArrayList<T> fromJsonList(String json, Class<T> cls) {
ArrayList<T> mList = new ArrayList<T>();
JsonArray array = new JsonParser().parse(json).getAsJsonArray();
for(final JsonElement elem : array){
mList.add(mGson.fromJson(elem, cls));
}
return mList;
}
当然如果你也愿意想JackJson那样传参也是可以的,代码如下:
public <T> ArrayList<T> fromJsonList(String json,TypeToken<ArrayList<T>> mTypeToken){
ArrayList<T> list=mGson().fromJson(json, mTypeToken.getType());
return list;
}
JackJsonFactory引用的jackson-all-1.7.6.jar是以前老版本的基础上开发的,如果你是下载的最新的jar可能存在包名的错误,重新导包即可
。对应Json解析还有个小小的问题一直想不通,TypeReference<ArrayList<T>> 这个参数每次都要new,重复代码部分TypeReference和ArrayList,
那么是否可以每次传入一个T或者T.class,然后通过一个方法获取TypeReference,这个一直是我的困惑。各位走过路过的帅哥美女,如有
知道还请不吝赐教,如有现在不知道的以后可能明了的,还望告知,小弟我在此深表感谢。