免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 17594 | 回复: 3
打印 上一主题 下一主题

使用Gson进行json数据转换(list to json 和json to list) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-03-15 17:24 |只看该作者 |倒序浏览
使用Gson进行json数据转换(list to json 和json to list)










转载至:http://www.cnblogs.com/chenlhuaf ... 5/01/gson_test.html

发现了google的gson,因为之前对于protocolbuf有一些了解,带着一些好奇心,我开始使用了gson。
经过比较,gson和其他现有java json类库最大的不同时gson需要序列化得实体类不需要使用annotation来标识需要序列化得字段,同时gson又可以通过使用annotation来灵活配置需要序列化的字段。
下面是一个简单的例子:

Java代码
  1. 1.public class Person {   
  2. 2.  
  3. 3.    private String name;   
  4. 4.    private int age;   
  5. 5.  
  6. 6.    /**  
  7. 7.     * @return the name  
  8. 8.     */  
  9. 9.    public String getName() {   
  10. 10.        return name;   
  11. 11.    }   
  12. 12.  
  13. 13.    /**  
  14. 14.     * @param name the name to set  
  15. 15.     */  
  16. 16.    public void setName(String name) {   
  17. 17.        this.name = name;   
  18. 18.    }   
  19. 19.  
  20. 20.    /**  
  21. 21.     * @return the age  
  22. 22.     */  
  23. 23.    public int getAge() {   
  24. 24.        return age;   
  25. 25.    }   
  26. 26.  
  27. 27.    /**  
  28. 28.     * @param age the age to set  
  29. 29.     */  
  30. 30.    public void setAge(int age) {   
  31. 31.        this.age = age;   
  32. 32.    }   
  33. 33.      
  34. 34.    @Override  
  35. 35.    public String toString()   
  36. 36.    {   
  37. 37.        return name + ":" +age;   
  38. 38.    }   
  39. 39.}  
  40. public class Person {

  41.     private String name;
  42.     private int age;

  43.     /**
  44.      * @return the name
  45.      */
  46.     public String getName() {
  47.         return name;
  48.     }

  49.     /**
  50.      * @param name the name to set
  51.      */
  52.     public void setName(String name) {
  53.         this.name = name;
  54.     }

  55.     /**
  56.      * @return the age
  57.      */
  58.     public int getAge() {
  59.         return age;
  60.     }

  61.     /**
  62.      * @param age the age to set
  63.      */
  64.     public void setAge(int age) {
  65.         this.age = age;
  66.     }
  67.    
  68.     @Override
  69.     public String toString()
  70.     {
  71.         return name + ":" +age;
  72.     }
  73. }
复制代码
实体很简单,两个字段,当然实体中的字段也可以是List或者Set类型的。

Java代码
  1. 1.Gson gson = new Gson();   
  2. 2.List<Person> persons = new ArrayList<Person>();   
  3. 3.for (int i = 0; i < 10; i++) {   
  4. 4.     Person p = new Person();   
  5. 5.     p.setName("name" + i);   
  6. 6.     p.setAge(i * 5);   
  7. 7.     persons.add(p);   
  8. 8.}   
  9. 9.String str = gson.toJson(persons);  
  10. Gson gson = new Gson();
  11. List<Person> persons = new ArrayList<Person>();
  12. for (int i = 0; i < 10; i++) {
  13.      Person p = new Person();
  14.      p.setName("name" + i);
  15.      p.setAge(i * 5);
  16.      persons.add(p);
  17. }
  18. String str = gson.toJson(persons);
复制代码
上面的代码重点是Gson对象,它提供了toJason()方法将对象转换成Json字符串,上面代码的str对象值为:
  1. [{"name":"name0","age":0},{"name":"name1","age":5},{"name":"name2","age":10},{"name":"name3","age":15},{"name":"name4","age":20},{"name":"name5","age":25},{"name":"name6","age":30},{"name":"name7","age":35},{"name":"name8","age":40},{"name":"name9","age":45}]
复制代码
很标准的json数据,很简单吧,呵呵。
下面来看看gson的反序列化,Gson提供了fromJson()方法来实现从Json相关对象到java实体的方法。
在日常应用中,我们一般都会碰到两种情况,转成单一实体对象和转换成对象列表或者其他结构。
先来看第一种:
比如json字符串为:
  1. [{"name":"name0","age":0}]
复制代码
代码:

Java代码
  1. 1.Person person = gson.fromJson(str, Person.class);  
  2. Person person = gson.fromJson(str, Person.class);
复制代码
提供两个参数,分别是json字符串以及需要转换对象的类型。
第二种,转换成列表类型:
代码:

Java代码
  1. 1.List<Person> ps = gson.fromJson(str, new TypeToken<List<Person>>(){}.getType());   
  2. 2.for(int i = 0; i < ps.size() ; i++)   
  3. 3.{   
  4. 4.     Person p = ps.get(i);   
  5. 5.     System.out.println(p.toString());   
  6. 6.}  
  7. List<Person> ps = gson.fromJson(str, new TypeToken<List<Person>>(){}.getType());
  8. for(int i = 0; i < ps.size() ; i++)
  9. {
  10.      Person p = ps.get(i);
  11.      System.out.println(p.toString());
  12. }
复制代码
可以看到上面的代码使用了TypeToken,它是gson提供的数据类型转换器,可以支持各种数据集合类型转换。
Gson的基本使用就是这么多,至于annotation方面可以参考gson的官方文档,希望能对初学java和gson的同学有所帮助。

论坛徽章:
0
2 [报告]
发表于 2012-03-15 17:24 |只看该作者
谢谢分享

论坛徽章:
0
3 [报告]
发表于 2012-05-29 11:31 |只看该作者
类似Java序列化,可以用"transient"关键字,表示不需要导出到JSON。这一点也很方便。这样就可以做到完全没有annotation。
用annotation会产生依赖,不用annotation可以做出多种实现。

论坛徽章:
0
4 [报告]
发表于 2012-05-30 08:43 |只看该作者
好东西,谢谢分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP