论坛首页 Java企业应用论坛

JSON之解析利器GSON

浏览 33383 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2013-07-30  
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还可以使用注解简化,在这里笔者就不给出代码了,有兴趣的读者可以自己研究一下
   发表时间:2013-07-31  
和fastjson相比呢?
0 请登录后投票
   发表时间:2013-08-02  
有做过最常用的一些JSON解析器性能对比测试
0 请登录后投票
   发表时间:2013-08-03  
灵活性不够,解析map之类还是有些力不从心
0 请登录后投票
   发表时间:2013-08-03  
推荐使用jackson
0 请登录后投票
   发表时间:2013-08-05  
跟jackson比有什么优势?
0 请登录后投票
   发表时间:2013-08-05  
推荐fastjson
0 请登录后投票
   发表时间:2013-08-06  
一般用fastjson
0 请登录后投票
   发表时间:2013-08-15  
gson 太简单了。
还是jackson 功能强大
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics