Gson(又称Google Gson)是Google公司发布的一个开放源代码的Java库,主要用途为串行化Java对象为JSON字符串,或反串行化JSON字符串成Java对象。GSON核心jar包不到1M,非常精简,但提供的功能无疑是非常强大的,如果使用JDK自带的JSON解析API,使用起来相对比较繁琐一点,而且代码量较多。

下面通过一个表格来了解一下,GSON目前的发展状况


初始版本 2008年5月22日
最新版本(稳定版本) 2.2.4/2013年5月13日;2个月前
编程语言 Java
操作平台 各种平台
许可协议 Apache License 2.0
官方网站 http://code.google.com/p/google-gson/
下载地址 http://code.google.com/p/google-gson/downloads/list
GSON帮助文档 http://google-gson.googlecode.com/svn/trunk/gson/docs/javadocs/index.html

下图是,使用GSON转换时报的一个异常。

  1. Exception in thread "main" com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2
  2. at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:176)
  3. at com.google.gson.Gson.fromJson(Gson.java:803)
  4. at com.google.gson.Gson.fromJson(Gson.java:768)
  5. at com.google.gson.Gson.fromJson(Gson.java:717)
  6. at com.google.gson.Gson.fromJson(Gson.java:689)
  7. at com.demoone.UseGson.testOneBeanFromJSON(UseGson.java:54)
  8. at com.demoone.UseGson.main(UseGson.java:89)
  9. Caused by: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2   //注意这句话跟数组集合有关
  10. at com.google.gson.stream.JsonReader.beginObject(JsonReader.java:374)
  11. at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:165)
  12. ... 6 more

下面贴出,笔者的测试源码,注意上述异常,在代码的注释中已经指出问题原因

  1. package com.demoone;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import com.entity.Person;
  5. import com.google.gson.Gson;
  6. import com.google.gson.reflect.*;
  7. /***
  8. *
  9. * 使用gson
  10. * 进行序列化,反序列化的操作
  11. * json
  12. *
  13. * **/
  14. public class UseGson {
  15. static Gson g=new Gson();
  16. /**
  17. *
  18. * 由集合类型的实体类
  19. * 转换成Json类型
  20. *
  21. * **/
  22. public static void testToJSON(){
  23. List<Person> list=new ArrayList<>();
  24. for(int i=0;i<2;i++){
  25. Person p=new Person(i, "散仙"+i, "北京市"+i, "54152541@qq.com", 500.0);
  26. list.add(p);
  27. }
  28. String json=g.toJson(list);
  29. System.out.println(json);
  30. }
  31. /**
  32. * 由json转换为实体类
  33. *
  34. * */
  35. public static void testOneBeanFromJSON(){
  36. /**
  37. * 转换一个Java Bean的时候
  38. * 记住不能使用[],只有在使用集合的时候才可以使用
  39. * 如上图贴的那个异常就是由此原因造成的,另外
  40. * 格式要规范,中间不能出现空格字符
  41. *
  42. * **/
  43. String jsonBean="[{\"id\":0,\"name\":\"散仙0\",\"address\":\"北京市0\",\"email\":\"54152541@qq.com\",\"money\":500.0}]";
  44. Person p=g.fromJson(jsonBean, Person.class);
  45. System.out.println(p);
  46. }
  47. /**
  48. * 由json转换为实体类集合
  49. *
  50. * */
  51. public static void testListBeanFromJSON(){
  52. /**
  53. * 转换一个集合 的实体Bean
  54. * 注意前面加上[]方括号,代表一个数组
  55. * **/
  56. String  jsonBeanList="[{\"id\":0,\"name\":\"散仙0\",\"address\":\"北京市0\",\"email\":\"54152541@qq.com\",\"money\":500.0},{\"id\":1,\"name\":\"散仙1\",\"address\":\"北京市1\",\"email\":\"54152541@qq.com\",\"money\":500.0}]";
  57. List<Person> lists=g.fromJson(jsonBeanList,new   TypeToken<List<Person>>(){}.getType());
  58. System.out.println("反序列之后");
  59. for(Person pp:lists){
  60. System.out.println(pp);
  61. }
  62. }
  63. public static void main(String[] args) {
  64. testListBeanFromJSON();//测试集合反序列化
  65. testOneBeanFromJSON();//测试单个实体类反序列化
  66. //testToJSON();//测试序列化
  67. }
  68. }

运行结果:

  1. testListBeanFromJSON()  方法:
  2. 反序列之后
  3. 编号:0  名字:散仙0   地址:北京市0   E-mail:54152541@qq.com  钱:500.0
  4. 编号:1  名字:散仙1   地址:北京市1   E-mail:54152541@qq.com  钱:500.0
  5. testOneBeanFromJSON()  方法:
  6. 编号:0  名字:散仙0   地址:北京市0   E-mail:54152541@qq.com  钱:500.0

实体类Person:

  1. package com.entity;
  2. /**
  3. * 实体类
  4. *
  5. *
  6. * **/
  7. public class Person {
  8. private int id;
  9. private String name;
  10. private String address;
  11. private String email;
  12. private double money;
  13. @Override
  14. public String toString() {
  15. // TODO Auto-generated method stub
  16. return  "编号:"+id+"  名字:"+name+"   地址:"+address+"   E-mail:"+email+"  钱:"+money;
  17. }
  18. public Person() {
  19. // TODO Auto-generated constructor stub
  20. }
  21. public Person(int id, String name, String address, String email,
  22. double money) {
  23. super();
  24. this.id = id;
  25. this.name = name;
  26. this.address = address;
  27. this.email = email;
  28. this.money = money;
  29. }
  30. public int getId() {
  31. return id;
  32. }
  33. public void setId(int id) {
  34. this.id = id;
  35. }
  36. public String getName() {
  37. return name;
  38. }
  39. public void setName(String name) {
  40. this.name = name;
  41. }
  42. public String getAddress() {
  43. return address;
  44. }
  45. public void setAddress(String address) {
  46. this.address = address;
  47. }
  48. public String getEmail() {
  49. return email;
  50. }
  51. public void setEmail(String email) {
  52. this.email = email;
  53. }
  54. public double getMoney() {
  55. return money;
  56. }
  57. public void setMoney(double money) {
  58. this.money = money;
  59. }
  60. }

体会到了GSON的强大了吧,GSON还可以使用注解简化,在这里笔者就不给出代码了,有兴趣的读者可以自己研究一下 

【jar包】JSON之解析利器GSON--【gson-2.2.4.jar】的更多相关文章

  1. 【maven】idea的pom文件修改,引入新的jar包,无效,本地仓库始终没有下载新jar包的问题解决【idea pom Dependency not found】

    引入问题: idea的pom文件修改,引入新的jar包,无效,本地仓库始终没有下载新jar包的问题解决[idea  pom Dependency  not found] 如题,引入一个新的jar包,在 ...

  2. maven项目依赖其他jar包的时候,idea运行没问题,java -jar 报错:java.lang.SecurityException: Invalid signature file digest

    当项目依赖其他jar包的时候,打出的jar包执行出错,抛出这个异常. 原因:因为依赖jar包中的META-INF中有多余的.SF文件与当前jar包冲突, 解决方案 一 在打包前删除依赖jar包的.SF ...

  3. 以jar包为容器的java程序访问一同打到jar包里的配置文件的方法

    Java程序有时会被打到jar包里执行,同时src/main/resources里一些配置文件也会被打进去. 比如,src/main/resources下有一个box目录,里面有几个json文件,用m ...

  4. 使用idea 在springboot添加本地jar包的方法本地运行有效,一旦需要打jar就会报错,这就需要在

    https://blog.csdn.net/huxiaodong1994/article/details/80702278 1.首先在与src同级的目录下新建一个lib目录,然后将本地jar包放在li ...

  5. Springboot中如何引入本地jar包,并通过maven把项目成功打包成jar包部署

    最近尝试引入阿里云的短信验证码,阿里云的core sdk是maven就有的,但是短信相关的jar包却不是放在maven的,所以得引入本地的下载回来的jar包.本地开发直接引入,idea是可以直接跑调用 ...

  6. 替换Jar包中的一个文件 Replace a file in a JAR

    例如: jar uf myJarFile.jar com\vsoft\servlet\myServlet.class This will replace the class myServlet.cla ...

  7. 使用Gson轻松解决复杂结构的Json数据解析

    转载请注明来源: http://blog.csdn.net/kjunchen/article/details/50961803 JSON简介 JSON(JavaScript Object Notati ...

  8. java项目中可能会使用到的jar包解释

    一.Struts2 用的版本是struts2.3.1.1 一个简单的Struts项目所需的jar包有如下8个 1. struts2-core-2.3.1.1.jar: Struts2的核心类库. 2. ...

  9. 常见 jar包详解

        常见 jar包详解 jar包 用途 axis.jar SOAP引擎包 commons-discovery-0.2.jar 用来发现.查找和实现可插入式接口,提供一些一般类实例化.单件的生命周期 ...

随机推荐

  1. VC和gcc在保证功能static对线程安全的差异变量

    VC和gcc不同,不能保证静态变量的线程安全性.这就给我们的程序带来了非常大的安全隐患和诸多不便.这一点应该引起我们的重视!尤其是在构造函数耗时比較长的时候.非常可能给程序带来意想不到的结果.本文从測 ...

  2. 通过管道进行线程间通信:字节流。字符流的用法及API类似

    管道流(PipedStream)可以用于不同线程间直接传送数据.一个线程发送数据到输出管道,另一个线程从输入管道中读取数据.通过使用管道,实现不同线程间的通信,而无须借助于类似临时文件之类的东西. p ...

  3. MPI编程简述

    第三章MPI计划 3.1 MPI简单介绍 多线程是一种便捷的模型,当中每一个线程都能够訪问其他线程的存储空间.因此,这样的模型仅仅能在共享存储系统之间移植. 一般来讲,并行机不一定在各处理器之间共享存 ...

  4. ssh 综合

    文件夹结构: 搭建项目: 1.创建web项目 2.创建各种包. com.atguigu.surveypark.dao.impl com.atguigu.surveypark.model com.atg ...

  5. ios结构体httpPost头结构

    ios结构体httpPost头结构 by 吴雪莹 NSString* urlStr = @"; NSURL* url = [NSURL URLWithString:urlStr]; NSMu ...

  6. sql server、c# 命名规范

    查了不少资料,没有我想要的. 还不如下载 官方的 数据 Northwind ,pubs 参见 https://www.microsoft.com/en-us/download/confirmation ...

  7. C#中如何获取系统环境变量

    原文:C#中如何获取系统环境变量 C#中获取系统环境变量需要用到Environment Class.其中提供了有关当前环境和平台的信息以及操作它们的方法.该类不能被继承. 以下代码得到%systemd ...

  8. Eclipse生成jsp 如何将GB18030 改成默认UTF-8

    前两天面试被问到了struts的问题,好久没用了准备复习下,用eclipse创建一个maven项目的时候发现创建的jsp文件都是GB18030编码的,如何更改为UTF-8呢,其实很简单,给各位分享一下 ...

  9. Front End Books

    Front End Books 记录和推荐一些认为还不错的前端方面的书籍.列入标准: 看过,并觉得值得推荐给大家的. 正在看的,已经觉得不错的,或者听闻别人说不错的. 打算看的,经多人推荐,一致认为必 ...

  10. Windows系统服务的编写。

    实验资源下载地址:点击打开链接 只是不知道能不能从服务向桌面进程传递消息,,就像两个桌面进程之间用Sendmessage似的..希望有知道的大神可以指点一下..不胜感激.. 因为微软在Vista之后, ...