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,可以参考官方文档