`
zhiweiofli
  • 浏览: 513994 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论
阅读更多

Json(JavaScript Object Notation)是一种轻量级的数据交换格式,类似XML,但比XML更小更快更容易解析。当前各种流行的web应用框架都对Json提供良好的支持,各种流行开发语言也支持Json解析。

 

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

 

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;
	}
	
}

 

具体实现的子类如下:

 

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能有效分离这些不规范的命名到其他模块代码中去。

 

 

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解析封装工具:

 

/**
 * 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;
	}

}

 

引用方式十分简单:

 

(UserInfo)JsonUtil.jsonToBean(jsonString, UserInfo.class);

 

3、解析复杂Json的方式

Gson支持解析多层结构的Json,当然对于多层解析的效率,暂时还没测试过,估计效率下降不会超过JSONObject...

想解析Json中的Json,Json中的Json数组,Gson提供InstanceCreator结构,来实例化对应的对象,用来加载已解析的json数据。估计解析的流程是,Gson反射属性名称前,先考量能否获得其对应的实例,再对属性对象进行反射、赋值,如此迭代进行...

 

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

 

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的自动化生成,注释的使用,容以后再分享...

 

 

7
4
分享到:
评论
11 楼 hualikejava 2013-10-15  
Gson 用起来很方便是真的,直接可以转换成指定类
10 楼 南通ori 2013-02-22  
马克,正在学习gson。
9 楼 liu5047853521 2012-12-05  
恩写的真不错,看的非常的详细,附上API一份http://google-gson.googlecode.com/svn/trunk/gson/docs/javadocs/index.html
8 楼 zhiweiofli 2012-10-17  
jefyjiang 写道
fastjson真心不错,强烈推荐

有空要试试看,谢谢推荐
7 楼 glamey 2012-09-25  
还是推荐使用jackson
6 楼 qkjava 2012-09-25  
"值对象必须实现序列化接口" 是必需要做滴
5 楼 jefyjiang 2012-09-25  
fastjson真心不错,强烈推荐
4 楼 endisonlai 2012-09-25  
上次项目尝试了fastjson,不知效果如何?
3 楼 nevernam 2012-09-24  
不知道比起fastjson如何,楼主是否有测试过?
2 楼 suncmjava 2012-09-24  
Gson用起来很爽,感谢分享
1 楼 evilgod528 2012-09-24  
多谢分享。。。

相关推荐

    Gson解析复杂Json实例,超简单

    本教程将深入探讨如何使用Gson库解析复杂的JSON实例,让你只需寥寥几行代码就能轻松处理JSON解析问题。 ### Gson库简介 Gson库的核心功能是将Java对象(如自定义类)转换为JSON字符串,反之亦然。这个库非常直观,...

    Json解析Gson解析

    本篇文章将深入探讨JSON解析以及Gson库的使用方法。 一、JSON解析基础 JSON是一种独立于语言的数据表示格式,其结构清晰,易于人阅读和编写,同时也容易让机器解析和生成。JSON主要由键值对(key-value pairs)...

    AndroidJSON解析框架GSON

    **Android JSON解析框架GSON详解** 在Android应用开发中,数据交换经常采用JSON格式,因为它轻量级、易于阅读和编写,并且被广泛支持。为了高效地解析和生成JSON,Google提供了一个强大的库——GSON。GSON允许将...

    Gson解析json数据

    Gson是Google开发的一款Java库,用于在Java对象和JSON数据之间进行映射。它使得在Java应用程序中处理JSON变得非常简单,无论是将JSON转换为等效的Java对象,还是将Java对象转换为JSON格式的字符串。在本文中,我们将...

    解析json的gson

    在"解析json的gson"这一主题中,我们将深入探讨Gson库的主要特性和使用方法。首先,我们来看如何创建一个简单的JSON对象。在Java中,你可以定义一个类来表示你的数据结构,然后使用Gson库将其转换为JSON字符串: ``...

    谷歌开源json解析库GSON

    2. **JSON字符串到对象的转换**:相反,GSON也支持将JSON字符串解析为Java对象。这通常通过`fromJson()`方法实现,它接受一个JSON字符串和目标类型的Class对象,返回一个Java对象。 ```java User user = gson.from...

    通过Gson解析Json文件

    本篇文章将详细阐述如何使用Gson库解析JSON文件,帮助开发者理解并掌握这一技能。 首先,我们需要了解什么是JSON。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于...

    JSON、GSON解析json

    GSON的强大之处在于它可以自动映射JSON数据到Java对象,大大简化了JSON解析和序列化的过程。 以下是关于JSON和GSON在Android开发中的具体知识点: 1. JSON基本结构:JSON包含两种主要数据结构,对象(Object)和数...

    使用Gson解析Json数据

    1、生成Json数据 2、使用Gson解析Json数据(单个json对象、json数组和json对象内嵌json数组) // 这里有两篇好心人的博文,有详细的讲解 http://www.jb51.net/article/32547.htm ...

    google专用解析json工具之gson源码

    - **JsonReader与JsonWriter**:Gson库提供了JsonReader和JsonWriter两个类,分别用于解析JSON输入流和生成JSON输出流。它们提供了逐字段读写JSON数据的方法,适用于处理复杂的JSON结构。 2. **GsonBuilder**: ...

    GSON相关头文件与json的解析库

    使用GSON进行JSON解析的基本操作如下: 1. **序列化**:将Java对象转换为JSON字符串。 ```java Gson gson = new Gson(); String jsonString = gson.toJson(yourJavaObject); ``` 2. **反序列化**:将JSON字符...

    json解析 gson fastjson

    总结来说,这三个JSON解析库各有优势。Gson以其强大的类型映射和灵活性深受喜爱;Fastjson凭借其高效的性能和简洁的API赢得了开发者的心;而org.json则因其轻量级和易用性在某些场景下成为不错的选择。在实际项目中...

    Json解析案例json,fastjson,gson

    本文将深入探讨三种广泛使用的JSON解析库:原生的`json`库,阿里巴巴的`fastjson`,以及Google的`gson`。 ### 1. 原生`json`库 Android系统内建了一个简单的`org.json`库,提供基本的JSON操作。它包括`JSONObject`...

    使用gson解析json

    Gson是Google推出的一个JSON解析器库,用于将JSON字符串解析成Java对象,或者将Java对象转换成JSON字符串。Gson提供了一个简单的API,用于解析和生成JSON数据。使用Gson可以简化JSON数据的处理,提高开发效率。 ...

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

    二、Android中的JSON解析 在Android中,我们通常使用`org.json`库或`com.google.gson`库来解析JSON数据。 1. `org.json`库:这是Android SDK自带的一个轻量级库,主要用于解析简单的JSON数据。 - JSONObject:...

    android中的JSON数据解析库gson和fastjson

    为了方便地将JSON字符串转换为Java对象或反之,开发者通常会借助于特定的库,其中最常用的两个是Gson和Fastjson。 **Gson** Gson是由Google提供的一个开源库,其主要功能是将Java对象转换为对应的JSON字符串,以及...

    复杂的Json数据解析-Gson解析

    本文将通过一个具体的例子来探讨如何使用Google提供的Gson库来进行复杂的JSON数据解析。 #### JSON概述 JSON是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。它基于JavaScript的一个...

    Gson解析复杂json数据

    Gson 解析复杂 JSON 数据 Gson 是一个由 Google 开发的 Java 库,用来将 Java 对象转换...在解析 JSON 数据时,我们需要使用 Gson 库提供的注解来指定 JSON 字段对应的 Java 字段,并使用 TypeToken 来指定嵌套结构。

    json+gson用到的jar

    Gson的优势在于其强大的类型安全性和自动序列化/反序列化功能,使得开发者无需手动编写繁琐的JSON解析代码。 在Java开发中,为了使用JSON和Gson,你需要包含以下jar包: 1. **json.jar**:这是处理JSON的基本库,...

    Android Studio下使用Google Gson解析Json数据示例

    在Android Studio中,Gson库可以帮助我们方便地解析和生成JSON数据。本篇文章将详细介绍如何在Android Studio环境下使用Google Gson解析Json数据。 首先,我们需要在项目中引入Gson库。打开build.gradle模块文件,...

Global site tag (gtag.js) - Google Analytics