`

GOSN

    博客分类:
  • GSON
 
阅读更多
Json解析之Gson库

博客分类: Android那些事儿小小的Java撑起大大的Program
Gsonjsonjava解析jsonjson解析
Json(JavaScript Object Notation)是一种轻量级的数据交换格式,类似XML,但比XML更小更快更容易解析。当前各种流行的web应用框架都对Json提供良好的支持,各种流行开发语言也支持Json解析。

Java中解析Json的方式也很多,根据官方的JSONObject库,自己设计的一个抽象工具类:

Java代码 
import java.io.Serializable; 
import java.util.List; 
 
import org.json.JSONException; 
import org.json.JSONObject; 
 
public abstract class JsonParser <T extends Serializable>{ 
     
    abstract List<T> getListFromJson(String str); 
     
    abstract T getObjectFromJson(JSONObject jobj); 
     
    public T getObjectFromJson(String str) { 
        try { 
            JSONObject jsonObject = new JSONObject(str); 
            return getObjectFromJson(jsonObject); 
        } catch (JSONException e) { 
            e.printStackTrace();  
        } catch(Exception e){ 
            e.printStackTrace(); 
        } 
        return null; 
    } 
     
    protected String getValueByName(JSONObject jobj, String name) 
            throws JSONException{ 
        if(jobj.has(name)){ 
            return jobj.getString(name); 
        } 
        return null; 
    } 
     


具体实现的子类如下:

Java代码 
public class UserInfoParser extends JsonParser<UserInfo> { 
 
    private UserInfoParser() { 
         
    } 
     
    @Override 
    List<UserInfo> getListFromJson(String str) { 
        try { 
            JSONArray array = new JSONArray(str); 
            int len = array.length(); 
            ArrayList<UserInfo> list = new ArrayList<UserInfo>(len); 
            for(int i=0;i<len;i++) { 
                UserInfo info = getObjectFromJson(array.getJSONObject(i)); 
                list.add(info); 
            } 
            return list; 
        } catch (JSONException e) { 
            e.printStackTrace(); 
        } 
        return null; 
    } 
 
    @Override 
    UserInfo getObjectFromJson(JSONObject jobj) { 
        try { 
            UserInfo info = new UserInfo(); 
            info.setId(getValueByName(jobj, UserInfo.NODE_ID)); 
            info.setFace(getValueByName(jobj,UserInfo.NODE_FACE)); 
            info.setUsername(getValueByName(jobj,UserInfo.NODE_USER_NAME)); 
            return info; 
        } catch (JSONException e) { 
            e.printStackTrace(); 
        } 
        return null; 
    } 
 


当泛型值对象T,对应的数据结构比较简单,层次比较少的时候,官方的JSONObject库解析还过得去。当遇到层次较多(Json里面包含N个Json数组),数据结构复杂(Json由对个复杂数据的Json组成)的Json,解析速度就会大大降低!

在处理复杂Json结构时,我推荐使用Google的Gson解析库。刚刚接触Gson时,我有以下疑虑:
1、Gson对Json的支持度如何,能不能支持所有的Json结构?
2、由于Gson是基于Java的反射原理来实现的,解析的效率如何保证?
3、上手难度如何?

当我在项目实验性地引入Gson后,我o嘴了~~真不愧是Google出品,实属佳品!

再我的项目是基于android平台的App,使用Gson之前,不仅http请求和Json数据解析的耗时太长,而且内存占有一直居高不下。
使用Gson后,解析的时间缩短了30%(这只是Json的解析时间,不算上http请求的时间),内存占用足足减少了一半!!!最重要的是,开发效率还提高不少,何以见得,请看:

1、值对象必须实现序列化接口,成员属性的名称必须与Json数据的key一致,建议遵从J2EE的标准,使用get-set方法控制属性的访问,因为Json的key是后台应用定义的,假如后台与前台的开发语言不同,命名规范也不一致,使用get-set能有效分离这些不规范的命名到其他模块代码中去。


Java代码 
public class UserInfo implements Serializable { 
 
    private static final long serialVersionUID = 1050128890144400614L; 
 
    private String id; 
    private String username; 
    private String face; 
 
    public String getId() { 
        return id; 
    } 
 
    public void setId(String id) { 
        this.id = id; 
    } 
 
    public String getUsername() { 
        return username; 
    } 
 
    public void setUsername(String username) { 
        this.username = username; 
    } 
 
    public String getFace() { 
        return face; 
    } 
 
    public void setFace(String face) { 
        this.face = face; 
    } 
 



2、奉上一个基于Gson的Json解析封装工具:

Java代码 
/**
* Gson类库的封装工具类,专门负责解析json数据</br>
* 内部实现了Gson对象的单例
* @author zhiweiofli
* @version 1.0
* @since 2012-9-18
*/ 
public class JsonUtil { 
 
    private static Gson gson = null; 
     
    static { 
        if (gson == null) { 
            gson = new Gson(); 
        } 
    } 
 
    private JsonUtil() { 
     
    } 
 
    /**
     * 将对象转换成json格式
     * 
     * @param ts
     * @return
     */ 
    public static String objectToJson(Object ts) { 
        String jsonStr = null; 
        if (gson != null) { 
            jsonStr = gson.toJson(ts); 
        } 
        return jsonStr; 
    } 
 
    /**
     * 将对象转换成json格式(并自定义日期格式)
     * 
     * @param ts
     * @return
     */ 
    public static String objectToJsonDateSerializer(Object ts, 
            final String dateformat) { 
        String jsonStr = null; 
        gson = new GsonBuilder() 
                .registerTypeHierarchyAdapter(Date.class, 
                        new JsonSerializer<Date>() { 
                            public JsonElement serialize(Date src, 
                                    Type typeOfSrc, 
                                    JsonSerializationContext context) { 
                                SimpleDateFormat format = new SimpleDateFormat( 
                                        dateformat); 
                                return new JsonPrimitive(format.format(src)); 
                            } 
                        }).setDateFormat(dateformat).create(); 
        if (gson != null) { 
            jsonStr = gson.toJson(ts); 
        } 
        return jsonStr; 
    } 
 
    /**
     * 将json格式转换成list对象
     * 
     * @param jsonStr
     * @return
     */ 
    public static List<?> jsonToList(String jsonStr) { 
        List<?> objList = null; 
        if (gson != null) { 
            java.lang.reflect.Type type = new com.google.gson.reflect.TypeToken<List<?>>() { 
            }.getType(); 
            objList = gson.fromJson(jsonStr, type); 
        } 
        return objList; 
    } 
     
    /**
     * 将json格式转换成list对象,并准确指定类型
     * @param jsonStr
     * @param type
     * @return
     */ 
    public static List<?> jsonToList(String jsonStr, java.lang.reflect.Type type) { 
        List<?> objList = null; 
        if (gson != null) { 
            objList = gson.fromJson(jsonStr, type); 
        } 
        return objList; 
    } 
 
    /**
     * 将json格式转换成map对象
     * 
     * @param jsonStr
     * @return
     */ 
    public static Map<?, ?> jsonToMap(String jsonStr) { 
        Map<?, ?> objMap = null; 
        if (gson != null) { 
            java.lang.reflect.Type type = new com.google.gson.reflect.TypeToken<Map<?, ?>>() { 
            }.getType(); 
            objMap = gson.fromJson(jsonStr, type); 
        } 
        return objMap; 
    } 
 
    /**
     * 将json转换成bean对象
     * 
     * @param jsonStr
     * @return
     */ 
    public static Object jsonToBean(String jsonStr, Class<?> cl) { 
        Object obj = null; 
        if (gson != null) { 
            obj = gson.fromJson(jsonStr, cl); 
        } 
        return obj; 
    } 
 
    /**
     * 将json转换成bean对象
     * 
     * @param jsonStr
     * @param cl
     * @return
     */ 
    @SuppressWarnings("unchecked") 
    public static <T> T jsonToBeanDateSerializer(String jsonStr, Class<T> cl, 
            final String pattern) { 
        Object obj = null; 
        gson = new GsonBuilder() 
                .registerTypeAdapter(Date.class, new JsonDeserializer<Date>() { 
                    public Date deserialize(JsonElement json, Type typeOfT, 
                            JsonDeserializationContext context) 
                            throws JsonParseException { 
                        SimpleDateFormat format = new SimpleDateFormat(pattern); 
                        String dateStr = json.getAsString(); 
                        try { 
                            return format.parse(dateStr); 
                        } catch (ParseException e) { 
                            e.printStackTrace(); 
                        } 
                        return null; 
                    } 
                }).setDateFormat(pattern).create(); 
        if (gson != null) { 
            obj = gson.fromJson(jsonStr, cl); 
        } 
        return (T) obj; 
    } 
 
    /**
     * 根据
     * 
     * @param jsonStr
     * @param key
     * @return
     */ 
    public static Object getJsonValue(String jsonStr, String key) { 
        Object rulsObj = null; 
        Map<?, ?> rulsMap = jsonToMap(jsonStr); 
        if (rulsMap != null && rulsMap.size() > 0) { 
            rulsObj = rulsMap.get(key); 
        } 
        return rulsObj; 
    } 
 


引用方式十分简单:

Java代码 
(UserInfo)JsonUtil.jsonToBean(jsonString, UserInfo.class); 

3、解析复杂Json的方式
Gson支持解析多层结构的Json,当然对于多层解析的效率,暂时还没测试过,估计效率下降不会超过JSONObject...
想解析Json中的Json,Json中的Json数组,Gson提供InstanceCreator结构,来实例化对应的对象,用来加载已解析的json数据。估计解析的流程是,Gson反射属性名称前,先考量能否获得其对应的实例,再对属性对象进行反射、赋值,如此迭代进行...

例如,解析Json数组的方式,实现:

Java代码 
public class UserInfoResult extends ResponseState implements InstanceCreator<List<UserInfo>>{ 
 
    private static final long serialVersionUID = -8701527648781449574L; 
     
    public List<UserInfo> userlist; 
 
    @Override 
    public List<UserInfo> createInstance(Type arg0) { 
        return new ArrayList<UserInfo>(2); 
    } 


对比JSONObject,Gson的好处在于:
1、高效,安全的反射,带来高效的解析速度
2、简化的开发流程,对比JSONObject每次都要设计解析的对象,Gson只需要设计值对象,由此带来的就是敏捷的开发
3、良好的支持,Gson属于开源项目,项目位于http://code.google.com/p/google-gson/,现在版本还在不断升级中,建议使用最新的稳定版。

最后,本文只对比介绍了Gson对Json解析的方面,对于Json的自动化生成,注释的使用,容以后再分享...
分享到:
评论
1 楼 gybin 2014-08-21  
jsonToList 这个方法会报错。。

相关推荐

    gosn的资源包

    gosn的资源包是针对Java开发者的工具,主要用于处理JSON数据。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,广泛应用于Web服务和应用程序之间的数据通信。Gson库是由Google开发的一个Java库,它...

    gosn 工具包

    gosn工具包是一个针对日志处理的解决方案,主要包含了两个组件:slf4j-log4j12-1.6.1.jar和slf4j-api-1.6.1.jar。这两个组件在Java开发中广泛用于日志记录,它们是SLF4J(Simple Logging Facade for Java)框架的一...

    android gosn 使用示例

    `gosn`是一个针对Android平台的轻量级库,它提供了方便的JSON操作功能,包括将Java对象转换为JSON字符串以及将JSON字符串解析成Java对象。这篇内容我们将深入探讨`gosn`库在Android中的使用方法,特别是其在日期时间...

    gosn .jar下载

    Gson(又称Google Gson)是Google公司发布的一个开放源代码的Java库,主要用途为串行化Java对象为JSON字符串,或反串行化JSON字符串成Java对象。

    select2的css和js,gosn.jar

    "select2的css和js,gosn.jar" 这个标题提到了两个主要组件:Select2的CSS样式文件和JavaScript库,以及一个名为`gosn.jar`的Java工具,它用于将Java对象转换为JSON格式的数据。 **描述详解:** 描述中进一步明确...

    android之json和gson数据解析最完整的代码例子(包括各种样式的json数据)

    JSON(JavaScript Object Notation)和Gson是Android开发中常用的数据序列化和反序列化工具,用于在客户端和服务器之间交换数据。本文将详细介绍如何在Android应用中使用JSON和Gson进行数据解析,并通过实际代码示例...

    Gson工具类JsonUtils

    在Java开发中,数据交换和序列化经常使用JSON(JavaScript Object Notation)格式,而Gson库是由Google提供的一个强大的库,用于在Java对象和JSON数据之间进行映射。JsonUtils是一个基于Gson的工具类,它扩展了Gson...

    Android GsonDemo

    网络上有很多Json解析库,这里我使用Gson来解析Json,Gson有个特点,就是要将数据的键作为变量封装到一个个实体中,如果值为数组的,变量的类型还必须是集合,然后通过Gson.fromJson来传入数据和实体类,再通过实体...

    Gson解析网络数据显示到listview上,加入万能适配器,适配器就10行,大家可以复制包用

    Gson解析网络数据显示到listview上,加入万能适配器,适配器就10行,大家可以复制包用,在log日记查看完整的Json数据,listview上我显示了title给大家看效果,适配器只要10行左右,简单易懂。

    gson-2.5.jar

    使用Google Gson解析Json数据时需要使用的 gson-2.5.jar,最新版本

    gson jar包下载

    Gson,全称为Google Simple JSON,是Google提供的一款开源库,用于在Java对象和JSON数据之间进行映射。这个库使得Java开发者能够轻松地将JSON字符串转换为等效的Java对象,反之亦然。在Java应用程序中,Gson库特别...

    gson各个版本 jar 包下载

    压缩包内包含:2.8.0 ~ 2.9.1,2.10 和 2.10.1 的 jar 包。 Gson JAR包是Google推出的一款功能强大的Java库,它主要用于在Java对象和JSON格式数据之间进行转换。Gson库提供了简单而直观的API,使得开发者可以轻松地...

    查看json格式的一款软件

    JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,被广泛应用于Web服务和应用程序之间的数据传输。它以易于人类阅读和编写,同时也易于机器解析和生成的方式组织数据。HiJson是一款专为查看和处理...

    gson-2.7.jar

    最新的gson架包,Gson是一个Java类库,用于将Java对象转换为它们所代表的JSON数据,也可以用于将一个JSON字符串转换为对应的Java对象。 Gson的目标为: 1) 提供像toString()和构造方法(工厂方法)一样简单使用的...

    gson和mysql的jar包

    gson和mysql的jar包,JavaWeb开发必备资源

    json包、gson包以及相应的源码

    JSON(JavaScript Object Notation)和Gson是两个在Java编程中广泛使用的数据序列化和反序列化库。JSON是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。Gson则是Google提供的一个开源库,...

    两种方式解析json数据

    在IT行业中,JSON(JavaScript Object Notation)是一种广泛使用的轻量级数据交换格式,它易于人阅读和编写,同时也易于机器解析和生成。当我们需要处理JSON数据时,通常有两种主要方法:一种是通过迭代器进行解析,...

    天气预报json解析

    标题中的“天气预报json解析”指的是在编程领域中,如何处理和解析来自网络的天气预报数据,这些数据通常以JSON(JavaScript Object Notation)格式提供。JSON是一种轻量级的数据交换格式,因其易于人阅读和编写,...

    使用Volley框架GET从网络上获取数据

    本文将深入探讨如何使用Volley框架通过GET方法从网络获取数据。 一、Volley概述 Volley是Android平台上的一个网络通信库,它的设计目标是简化网络请求并优化内存使用。Volley提供了异步网络请求、请求队列管理、...

    converter-gson-2.5.0.jar

    可以解决implementation 'com.squareup.retrofit2:converter-gosn:2.5.0' 依赖失败的问题

Global site tag (gtag.js) - Google Analytics