Gson-解析json之利器
2014-08-08 11:53
239 查看
Gson(又称Google Gson)是Google公司发布的一个开放源代码的Java库,主要用途为串行化Java对象为JSON字符串,或反串行化JSON字符串成Java对象。GSON核心jar包不到1M,非常精简,但提供的功能无疑是非常强大的,如果使用JDK自带的JSON解析API,使用起来相对比较繁琐一点,而且代码量较多。
下面通过一个表格来了解一下,GSON目前的发展状况
下图是,使用GSON转换时报的一个异常。
Java代码
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
下面贴出,笔者的测试源码,注意上述异常,在代码的注释中已经指出问题原因
Java代码
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();//测试序列化
}
}
运行结果:
Java代码
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:
Java代码
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,javadoc,source的压缩包,google-gson-2.2.2-release.zip下载:http://download.csdn.net/detail/u010122002/7729949
下面通过一个表格来了解一下,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 |
Java代码
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
下面贴出,笔者的测试源码,注意上述异常,在代码的注释中已经指出问题原因
Java代码
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();//测试序列化
}
}
运行结果:
Java代码
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:
Java代码
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,javadoc,source的压缩包,google-gson-2.2.2-release.zip下载:http://download.csdn.net/detail/u010122002/7729949
相关文章推荐
- Json转换利器Gson之实例五-实际开发中的特殊需求处理(手动解析-TypeToken)
- Json转换利器Gson之实例三-Map处理(上)--(LinkedHashMap)--(手动解析-TypeToken)
- 【jar包】JSON之解析利器GSON--【gson-2.2.4.jar】
- android 用gson解析json的时候报空指针
- Android中使用Gson解析JSON数据的两种方法
- Json转换利器Gson之实例一-简单对象转化和带泛型的List转化
- Json转换利器Gson之实例三-Map处理(上)
- Android中使用Gson解析JSON数据
- google-gson解析json数据---小实例
- Gson解析新浪微博API的json
- Android中使用Gson解析JSON数据
- Android学习笔记45:JSON数据解析(GSON方式)
- 很好用的Google 开源项目Gson在java中解析和创建json格式的数据
- Gson解析json数据
- Android JSON Gson 解析
- Android中使用Gson解析JSON数据
- Java下json的解析方法-----GSON与JSONObject
- android中用gson解析json
- Android 编程下使用 Google 的 Gson 解析 Json
- Json转换利器Gson之实例一-简单对象转化和带泛型的List转化