Gson网址http://code.google.com/p/google-gson/

这段时间项目中用到了json数据,采用的是google德Gson,经过两天的学习,算是有了点收获,现在把Gson的基本应用跟大家分享一下,

Gson主要完成JavaBean和json数据之间的转换,:

JavaBean--->json,称之为序列化(Serialization)

json--->JavaBean,称之为反序列化(Deserialization)

1、Gson对普通JavaBean的处理

Person.java

public class Person {
	private Integer id;
	private String userName;
	private String password;
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getUserName() {
		return userName;
	}
	public void setUserName(String userName) {
		this.userName = userName;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	
}

  

 测试代码:

	public static void main(String[] args) {
		Person person=new Person();
		person.setId(new Integer(1));
		person.setUserName("单守臣");
		person.setPassword("shanshouchen");
		
		GsonBuilder builder=new GsonBuilder();
		Gson gson=builder.create();
		//序列化
		String person_json=gson.toJson(person);
		System.out.println(person_json);
		//反序列化
		Person person_temp=gson.fromJson(person_json,Person.class);
		System.out.println(person_temp.getUserName());
		
	}

 

 打印结果: 

{"id":1,"userName":"单守臣","password":"shanshouchen"}
单守臣

 

2、Gson对数组的处理

 

public static void main(String[] args) {
		String[] array={"aaa","bbb","ccc"};
		
		GsonBuilder builder=new GsonBuilder();
		Gson gson=builder.create();
		//序列化
		String array_json=gson.toJson(array);
		System.out.println(array_json);
		//反序列化
		String[] array_temp=gson.fromJson(array_json,String[].class);
		for(String str:array_temp){
			System.out.println(str);
		}
	}

 打印结果

["aaa","bbb","ccc"]
aaa
bbb
ccc

 Gson支持多维数组,任意复杂的元素类型

 

3、Gson对List的处理

 

public static void main(String[] args) {
		List array=new ArrayList();
		array.add("andy");
		array.add(854587808);
		array.add(new Date());
		
		GsonBuilder builder=new GsonBuilder();
		Gson gson=builder.create();
		//序列化
		String array_json=gson.toJson(array);
		System.out.println(array_json);
		//反序列化
		List array_temp=gson.fromJson(array_json,List.class);
		for(int i=0;i<array_temp.size();i++){
			System.out.println(array_temp.get(i));
		}
	}

 打印结果:

["andy",854587808,"Jul 30, 2012 11:38:06 PM"]
andy
8.54587808E8
Jul 30, 2012 11:38:06 PM

 

4、Gson对Map的处理

 

public static void main(String[] args) {
		Map map=new HashMap();
		map.put("id",1L);
		map.put("userName","andy");
		map.put("date",new Date());
		
		GsonBuilder builder=new GsonBuilder();
		Gson gson=builder.create();
		//序列化
		String map_json=gson.toJson(map);
		System.out.println(map_json);
		//反序列化
		Map map_temp=gson.fromJson(map_json,Map.class);
		Iterator iterator=map.keySet().iterator();
		while(iterator.hasNext()){
			String key=iterator.next().toString();
			String value=map_temp.get(key).toString();
			System.out.println("key:"+key+"\tvalue:"+value);
		}
	}

 打印结果

{"id":1,"userName":"andy","date":"Jul 30, 2012 11:45:57 PM"}
key:id	value:1.0
key:userName	value:andy
key:date	value:Jul 30, 2012 11:45:57 PM

 

5、Gson对泛型的处理

 

public static void main(String[] args) {
		List<Person> listPerson=new ArrayList<Person>();
		
		Person person1=new Person();
		person1.setId(new Integer(1));
		person1.setUserName("单守臣");
		person1.setPassword("shanshouchen");
		
		Person person2=new Person();
		person2.setId(new Integer(2));
		person2.setUserName("andy");
		person2.setPassword("xiayuu");
		
		listPerson.add(person1);
		listPerson.add(person2);
		
		java.lang.reflect.Type type = new com.google.gson.reflect.TypeToken<List<Person>>() {}.getType();
		
		GsonBuilder builder=new GsonBuilder();
		Gson gson=builder.create();
		//序列化
		String listPerson_json=gson.toJson(listPerson,type);
		System.out.println(listPerson_json);
		//反序列化
		List<Person> listPerson_temp=gson.fromJson(listPerson_json,type);
		for(Person person:listPerson_temp){
			System.out.println(person.getUserName());
		}
	}

 打印结果

[{"id":1,"userName":"单守臣","password":"shanshouchen"},{"id":2,"userName":"andy","password":"xiayuu"}]
单守臣
andy

 

6、Date类型数据的转换

DateSerializerUtil.java

public class DateSerializerUtil implements JsonSerializer<Date> {

	@Override
	public JsonElement serialize(Date src, Type typeOfSrc, JsonSerializationContext context) {
		return new JsonPrimitive(src.getTime());
	}

}

 

DateDeserializerUtil.java

public class DateDeserializerUtil implements JsonDeserializer<Date> {

	@Override
	public Date deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
		return new Date(json.getAsJsonPrimitive().getAsLong());
	}

}

 测试代码:

public class Test {

	public static void main(String[] args) {
		List<Person> listPerson=new ArrayList<Person>();
		Person person=new Person();
		person.setId(new Integer(3));
		person.setUserName("shanshouchen");
		person.setPassword("andy");
		person.setBirthday(new Date());
		listPerson.add(person);
		
		java.lang.reflect.Type type=new com.google.gson.reflect.TypeToken<List<Person>>(){}.getType();
		String beanListToJson=bean2json(listPerson, type);
		System.out.println(beanListToJson);
		
		List<Person> testBeanListFromJson=json2bean(beanListToJson, type);
		System.out.println(testBeanListFromJson);
		
	}

	/**
	 * 序列化方法
	 * 
	 * @param bean
	 * @param type
	 * @return
	 */
	public static String bean2json(Object bean, Type type) {
		Gson gson = new GsonBuilder().registerTypeAdapter(java.util.Date.class, new DateSerializerUtil()).setDateFormat(DateFormat.LONG).create();
		return gson.toJson(bean);
	}

	/**
	 * 反序列化方法
	 * @param <T>
	 * @param json
	 * @param type
	 * @return
	 */
	public static <T> T json2bean(String json, Type type) {
		Gson gson = new GsonBuilder().registerTypeAdapter(java.util.Date.class, new DateDeserializerUtil()).setDateFormat(DateFormat.LONG).create();
		return gson.fromJson(json, type);
	}

}

 打印结果:

[{"id":3,"userName":"shanshouchen","password":"andy","birthday":1343665055906}]
[com.andy.test.Person@19fcc69]

 

 

Gson在实际的应用中的技巧很多,比如可以通过@Expose注解结合GsonBuilder对象的excludeFieldsWithoutExposeAnnotation()方法类过滤不需要被序列化的属性,想更加深入的学习Gson,可以参考官方文档

 

 posted on 2012-07-31 00:25  单守臣  阅读(615)  评论(1编辑  收藏  举报