Android 开发之JSON数据解析

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,这个一直是我的困惑。各位走过路过的帅哥美女,如有
知道还请不吝赐教,如有现在不知道的以后可能明了的,还望告知,小弟我在此深表感谢。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值