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,这个一直是我的困惑。各位走过路过的帅哥美女,如有
知道还请不吝赐教,如有现在不知道的以后可能明了的,还望告知,小弟我在此深表感谢。
包含以下java源文件: com.google.gson.DefaultDateTypeAdapter.class com.google.gson.ExclusionStrategy.class com.google.gson.FieldAttributes.class com.google.gson.FieldNamingPolicy.class com.google.gson.FieldNamingStrategy.class com.google.gson.Gson.class com.google.gson.GsonBuilder.class com.google.gson.InstanceCreator.class com.google.gson.JsonArray.class com.google.gson.JsonDeserializationContext.class com.google.gson.JsonDeserializer.class com.google.gson.JsonElement.class com.google.gson.JsonIOException.class com.google.gson.JsonNull.class com.google.gson.JsonObject.class com.google.gson.JsonParseException.class com.google.gson.JsonParser.class com.google.gson.JsonPrimitive.class com.google.gson.JsonSerializationContext.class com.google.gson.JsonSerializer.class com.google.gson.JsonStreamParser.class com.google.gson.JsonSyntaxException.class com.google.gson.LongSerializationPolicy.class com.google.gson.TreeTypeAdapter.class com.google.gson.TypeAdapter.class com.google.gson.TypeAdapterFactory.class com.google.gson.annotations.Expose.class com.google.gson.annotations.SerializedName.class com.google.gson.annotations.Since.class com.google.gson.annotations.Until.class com.google.gson.internal.ConstructorConstructor.class com.google.gson.internal.Excluder.class com.google.gson.internal.JsonReaderInternalAccess.class com.google.gson.internal.LazilyParsedNumber.class com.google.gson.internal.LinkedTreeMap.class com.google.gson.internal.ObjectConstructor.class com.google.gson.internal.Primitives.class com.google.gson.internal.Streams.class com.google.gson.internal.UnsafeAllocator.class com.google.gson.internal.bind.ArrayTypeAdapter.class com.google.gson.internal.bind.CollectionTypeAdapterFactory.class com.google.gson.internal.bind.DateTypeAdapter.class com.google.gson.internal.bind.JsonTreeReader.class com.google.gson.internal.bind.JsonTreeWriter.class com.google.gson.internal.bind.MapTypeAdapterFactory.class com.google.gson.internal.bind.ObjectTypeAdapter.class com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.class com.google.gson.internal.bind.SqlDateTypeAdapter.class com.google.gson.internal.bind.TimeTypeAdapter.class com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.class com.google.gson.internal.bind.TypeAdapters.class com.google.gson.reflect.TypeToken.class com.google.gson.stream.JsonReader.class com.google.gson.stream.JsonScope.class com.google.gson.stream.JsonToken.class com.google.gson.stream.JsonWriter.class com.google.gson.stream.MalformedJsonException.class
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值