【jar包】JSON之解析利器GSON--【gson-2.2.4.jar】
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转换时报的一个异常。
- Exception in thread "main" com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2
- at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:176)
- at com.google.gson.Gson.fromJson(Gson.java:803)
- at com.google.gson.Gson.fromJson(Gson.java:768)
- at com.google.gson.Gson.fromJson(Gson.java:717)
- at com.google.gson.Gson.fromJson(Gson.java:689)
- at com.demoone.UseGson.testOneBeanFromJSON(UseGson.java:54)
- at com.demoone.UseGson.main(UseGson.java:89)
- Caused by: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2 //注意这句话跟数组集合有关
- at com.google.gson.stream.JsonReader.beginObject(JsonReader.java:374)
- at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:165)
- ... 6 more
下面贴出,笔者的测试源码,注意上述异常,在代码的注释中已经指出问题原因
- package com.demoone;
- import java.util.ArrayList;
- import java.util.List;
- import com.entity.Person;
- import com.google.gson.Gson;
- import com.google.gson.reflect.*;
- /***
- *
- * 使用gson
- * 进行序列化,反序列化的操作
- * json
- *
- * **/
- public class UseGson {
- static Gson g=new Gson();
- /**
- *
- * 由集合类型的实体类
- * 转换成Json类型
- *
- * **/
- public static void testToJSON(){
- List<Person> list=new ArrayList<>();
- for(int i=0;i<2;i++){
- Person p=new Person(i, "散仙"+i, "北京市"+i, "54152541@qq.com", 500.0);
- list.add(p);
- }
- String json=g.toJson(list);
- System.out.println(json);
- }
- /**
- * 由json转换为实体类
- *
- * */
- public static void testOneBeanFromJSON(){
- /**
- * 转换一个Java Bean的时候
- * 记住不能使用[],只有在使用集合的时候才可以使用
- * 如上图贴的那个异常就是由此原因造成的,另外
- * 格式要规范,中间不能出现空格字符
- *
- * **/
- String jsonBean="[{\"id\":0,\"name\":\"散仙0\",\"address\":\"北京市0\",\"email\":\"54152541@qq.com\",\"money\":500.0}]";
- Person p=g.fromJson(jsonBean, Person.class);
- System.out.println(p);
- }
- /**
- * 由json转换为实体类集合
- *
- * */
- public static void testListBeanFromJSON(){
- /**
- * 转换一个集合 的实体Bean
- * 注意前面加上[]方括号,代表一个数组
- * **/
- 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}]";
- List<Person> lists=g.fromJson(jsonBeanList,new TypeToken<List<Person>>(){}.getType());
- System.out.println("反序列之后");
- for(Person pp:lists){
- System.out.println(pp);
- }
- }
- public static void main(String[] args) {
- testListBeanFromJSON();//测试集合反序列化
- testOneBeanFromJSON();//测试单个实体类反序列化
- //testToJSON();//测试序列化
- }
- }
运行结果:
- testListBeanFromJSON() 方法:
- 反序列之后
- 编号:0 名字:散仙0 地址:北京市0 E-mail:54152541@qq.com 钱:500.0
- 编号:1 名字:散仙1 地址:北京市1 E-mail:54152541@qq.com 钱:500.0
- testOneBeanFromJSON() 方法:
- 编号:0 名字:散仙0 地址:北京市0 E-mail:54152541@qq.com 钱:500.0
实体类Person:
- package com.entity;
- /**
- * 实体类
- *
- *
- * **/
- public class Person {
- private int id;
- private String name;
- private String address;
- private String email;
- private double money;
- @Override
- public String toString() {
- // TODO Auto-generated method stub
- return "编号:"+id+" 名字:"+name+" 地址:"+address+" E-mail:"+email+" 钱:"+money;
- }
- public Person() {
- // TODO Auto-generated constructor stub
- }
- public Person(int id, String name, String address, String email,
- double money) {
- super();
- this.id = id;
- this.name = name;
- this.address = address;
- this.email = email;
- this.money = money;
- }
- public int getId() {
- return id;
- }
- public void setId(int id) {
- this.id = id;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public String getAddress() {
- return address;
- }
- public void setAddress(String address) {
- this.address = address;
- }
- public String getEmail() {
- return email;
- }
- public void setEmail(String email) {
- this.email = email;
- }
- public double getMoney() {
- return money;
- }
- public void setMoney(double money) {
- this.money = money;
- }
- }
体会到了GSON的强大了吧,GSON还可以使用注解简化,在这里笔者就不给出代码了,有兴趣的读者可以自己研究一下
【jar包】JSON之解析利器GSON--【gson-2.2.4.jar】的更多相关文章
- 【maven】idea的pom文件修改,引入新的jar包,无效,本地仓库始终没有下载新jar包的问题解决【idea pom Dependency not found】
引入问题: idea的pom文件修改,引入新的jar包,无效,本地仓库始终没有下载新jar包的问题解决[idea pom Dependency not found] 如题,引入一个新的jar包,在 ...
- maven项目依赖其他jar包的时候,idea运行没问题,java -jar 报错:java.lang.SecurityException: Invalid signature file digest
当项目依赖其他jar包的时候,打出的jar包执行出错,抛出这个异常. 原因:因为依赖jar包中的META-INF中有多余的.SF文件与当前jar包冲突, 解决方案 一 在打包前删除依赖jar包的.SF ...
- 以jar包为容器的java程序访问一同打到jar包里的配置文件的方法
Java程序有时会被打到jar包里执行,同时src/main/resources里一些配置文件也会被打进去. 比如,src/main/resources下有一个box目录,里面有几个json文件,用m ...
- 使用idea 在springboot添加本地jar包的方法本地运行有效,一旦需要打jar就会报错,这就需要在
https://blog.csdn.net/huxiaodong1994/article/details/80702278 1.首先在与src同级的目录下新建一个lib目录,然后将本地jar包放在li ...
- Springboot中如何引入本地jar包,并通过maven把项目成功打包成jar包部署
最近尝试引入阿里云的短信验证码,阿里云的core sdk是maven就有的,但是短信相关的jar包却不是放在maven的,所以得引入本地的下载回来的jar包.本地开发直接引入,idea是可以直接跑调用 ...
- 替换Jar包中的一个文件 Replace a file in a JAR
例如: jar uf myJarFile.jar com\vsoft\servlet\myServlet.class This will replace the class myServlet.cla ...
- 使用Gson轻松解决复杂结构的Json数据解析
转载请注明来源: http://blog.csdn.net/kjunchen/article/details/50961803 JSON简介 JSON(JavaScript Object Notati ...
- java项目中可能会使用到的jar包解释
一.Struts2 用的版本是struts2.3.1.1 一个简单的Struts项目所需的jar包有如下8个 1. struts2-core-2.3.1.1.jar: Struts2的核心类库. 2. ...
- 常见 jar包详解
常见 jar包详解 jar包 用途 axis.jar SOAP引擎包 commons-discovery-0.2.jar 用来发现.查找和实现可插入式接口,提供一些一般类实例化.单件的生命周期 ...
随机推荐
- 选择一个利于SEO的空间
大家好.今天蜗牛将给大家分享怎么选择一个利于SEO的站点空间. 一.什么是站点空间? 站点空间,是用来存你的站点的HTML,.图片.文件等的一个远程硬盘空间(就像你的电脑里面的空间一回事儿).依据不同 ...
- Centos7系统配置上的变化(二)网络管理基础
原文 Centos7系统配置上的变化(二)网络管理基础 上篇简单介绍了CentOS 7 在服务和网络方面的一点变化,先前很多烂熟于心的操作指令已经不适用了,不管是否习惯,总要接受.熟悉这些变化. 写上 ...
- 用jQuery写了一个模态框插件
用jQuery写了一个模态框插件 大家觉得下面的框框好看么, 水印可以去掉(这个任务交给你们了(- o -)~zZ); "info"框 $("div").con ...
- 第11章 享元模式(Flyweight Pattern)
原文 第11章 享元模式(Flyweight Pattern) 概述: 面向对象的思想很好地解决了抽象性的问题,一般也不会出现性能上的问题.但是在某些情况下,对象的数量可能会太多,从而导致了运行时 ...
- 关于访问MSMQ远端私有队列的一点经验
这里应该将私有队列称做"专用队列"好像更贴切一些了,O(∩_∩)O 可以访问远程主机的MSMQ的私有队列的,这个是毋庸置疑的,但需要说明的是不能通过代码创建私有队列,关于这一点,我 ...
- SQL中条件放在on后与where后的区别
SQL中on条件与where条件的区别 数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户. 在使用left jion时,on和where条件的区别如下: ...
- linux_mac_配置itrem2 rz sz_bug处理
0:传输 .jar 等文件有问题 是 添加 sz -bye 以二进制流方式传输 1:安装 homebrew 2: brew install lrzsz 3:搜索 iterm2-recv-zmod ...
- 分享一下我的部分毕设内容:基于Windows Phone平台的污染源管理应用
原文:分享一下我的部分毕设内容:基于Windows Phone平台的污染源管理应用 毕业半年,又总结了一下之前的工作,发现很多知识不复习都忘记了.最近新闻总是报道北京的空气污染,各种雾霾,各种PM X ...
- Tomcat剖析(三):连接器(1)
Tomcat剖析(三):连接器(1) 1. Tomcat剖析(一):一个简单的Web服务器 2. Tomcat剖析(二):一个简单的Servlet服务器 3. Tomcat剖析(三):连接器(1) 4 ...
- ThinkPHP神秘应用架构扩展
ThinkPHP应用模式提供了机会,改变核心框架.它可以让你的应用程序,以适应环境和其他许多不同的需求. 每一个应用模式都有自己的模式定义文件,相对与ThinkPHP3.1版本号.ThinkPHP3. ...