Google Gson的使用方法及JSON 技術對比

  一 、各個JSON技術的簡介和優劣
 

1.json-lib

json-lib最開始的也是應用最普遍的json解析工具,json-lib 很差的地方確實是依賴於不少第三方包,
包括commons-beanutils.jar,commons-collections-3.2.jar,commons-lang-2.6.jar,commons-logging-1.1.1.jar,ezmorph-1.0.6.jar,對於複雜類型的轉換,json-lib對於json轉換成bean還有缺陷,好比一個類裏面會出現另外一個類的list或者map集合,json-lib從json到bean的轉換就會出現問題。json-lib在功能和性能上面都不能知足如今互聯網化的需求。java

2.開源的Jackson

相比json-lib框架,Jackson所依賴的jar包較少,簡單易用而且性能也要相對高些。並且Jackson社區相對比較活躍,更新速度也比較快。Jackson對於複雜類型的json轉換bean會出現問題,一些集合Map,List的轉換出現問題。Jackson對於複雜類型的bean轉換Json,轉換的json格式不是標準的Json格式算法

3.Google的Gson

Gson是目前功能最全的Json解析神器,Gson當初是爲因應Google公司內部需求而由Google自行研發而來,
但自從在2008年五月公開發布初版後已被許多公司或用戶應用。Gson的應用主要爲toJson與fromJson兩個轉換函數,無依賴,不須要例外額外的jar,可以直接跑在JDK上。而在使用這種對象轉換以前需先建立好對象的類型以及其成員才能成功的將JSON字符串成功轉換成相對應的對象。類裏面只要有get和set方法,Gson徹底能夠將複雜類型的json到bean或bean到json的轉換,是JSON解析的神器。Gson在功能上面無可挑剔,可是性能上面比FastJson有所差距。json

4.阿里巴巴的FastJson

Fastjson是一個Java語言編寫的高性能的JSON處理器,由阿里巴巴公司開發。無依賴,不須要例外額外的jar,可以直接跑在JDK上。FastJson在複雜類型的Bean轉換Json上會出現一些問題,可能會出現引用的類型,致使Json轉換出錯,須要制定引用。FastJson採用首創的算法,將parse的速度提高到極致,超過全部json庫。

綜上4種Json技術的比較,在項目選型的時候能夠使用Google的Gson和阿里巴巴的FastJson兩種並行使用,若是隻是功能要求,沒有性能要求,能夠使用google的Gson,若是有性能上面的要求能夠使用Gson將bean轉換json確保數據的正確,使用FastJson將Json轉換Bean api

 

2、Google的Gson包的使用簡介。

Gson類:解析json的最基礎的工具類
JsonParser類:解析器來解析JSON到JsonElements的解析樹
JsonElement類:一個類表明的JSON元素
JsonObject類:JSON對象類型
JsonArray類:JsonObject數組
TypeToken類:用於建立type,好比泛型List<?>
數組

maven 依賴:框架

<dependency>
	<groupId>com.google.code.gson</groupId>
	<artifactId>gson</artifactId>
	<version>2.7</version>
</dependency>

3、Gson的使用maven

首先定義一個類:函數

package com.test;

import java.util.Date;

public class User {

	private Integer id;
	private int age;
	private String userName;
	private Date birthday;

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public String getUserName() {
		return userName;
	}

	public void setUserName(String userName) {
		this.userName = userName;
	}

	public Date getBirthday() {
		return birthday;
	}

	public void setBirthday(Date birthday) {
		this.birthday = birthday;
	}

	public User(Integer id, int age, String userName, Date birthday) {
		super();
		this.id = id;
		this.age = age;
		this.userName = userName;
		this.birthday = birthday;
	}

	public User() {
		super();
	}

}

測試實例:工具

package com.test;

import java.util.Date;
import java.util.List;
import java.util.Set;

import org.junit.Test;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.google.gson.reflect.TypeToken;

public class GsonTest {

	@Test
	public void test1() throws Exception {
		Gson gson = new Gson();
		User user = new User(1, 20, "AA", new Date());

		System.out.println("Bean->轉換爲JSON字符串:");
		String jsonStr = gson.toJson(user);
		System.out.println(jsonStr);
		System.out.println();
	}

	@Test
	public void test2() throws Exception {
		Gson gson = new Gson();
		String jsonStr = "{\"id\":1,\"age\":20,\"userName\":\"AA\",\"birthday\":\"Nov 14, 2016 4:52:38 PM\"}";
		System.out.println("字符串->轉換成Bean對象");
		User user = gson.fromJson(jsonStr, User.class);
		System.out.println(user);
		System.out.println();
	}

	@Test
	public void test3() throws Exception {
		Gson gson = new Gson();
		System.out.println("json轉換複雜的bean,好比List,Set,Map:");
		String json = "[{\"id\":\"1\",\"name\":\"Json技術\"},{\"id\":\"2\",\"name\":\"java技術\"}]";
		List list = gson.fromJson(json, new TypeToken<List>() {
		}.getType());
		Set set = gson.fromJson(json, new TypeToken<Set>() {
		}.getType());
		System.out.println();
	}

	@Test
	public void test4() throws Exception {
		Gson gson = new Gson();
		String json = "[{\"id\":\"1\",\"name\":\"Json技術\"},{\"id\":\"2\",\"name\":\"java技術\"}]";
		System.out.println("格式化JSON:");
		gson = new GsonBuilder().setPrettyPrinting().create();
		JsonParser jp = new JsonParser();
		JsonElement je = jp.parse(json);
		json = gson.toJson(je);
		System.out.println(json);
		System.out.println();

	}

	@Test
	public void test5() throws Exception {
		System.out.println("判斷字符串是不是json,經過捕捉的異常來判斷是不是json");
		String json = "[{\"id\":\"1\",\"name\":\"Json技術\"},{\"id\":\"2\",\"name\":\"java技術\"}]";
		boolean jsonFlag;
		try {
			new JsonParser().parse(json).getAsJsonObject();
			jsonFlag = true;
		} catch (Exception e) {
			jsonFlag = false;
		}
		System.out.println(jsonFlag + ":" + jsonFlag);
		System.out.println();
	}

	@Test
	public void test6() throws Exception {
		System.out.println("從json串中獲取屬性");
		String json = "{\"id\":\"1\",\"name\":\"Json技術\"}";
		String propertyName = "name";
		String propertyValue = "";
		try {
			JsonParser jsonParser = new JsonParser();
			JsonElement element = jsonParser.parse(json);
			JsonObject jsonObj = element.getAsJsonObject();
			propertyValue = jsonObj.get(propertyName).toString();
			System.out.println("propertyValue:" + propertyValue);
		} catch (Exception e) {
			propertyValue = null;
		}
		System.out.println();
	}

	@Test
	public void test7() throws Exception {
		System.out.println("除去json中的某個屬性");
		String json = "{\"id\":\"1\",\"name\":\"Json技術\"}";
		String propertyName = "id";
		JsonParser jsonParser = new JsonParser();
		JsonElement element = jsonParser.parse(json);
		JsonObject jsonObj = element.getAsJsonObject();
		jsonObj.remove(propertyName);
		json = jsonObj.toString();
		System.out.println("json:" + json);
		System.out.println();
	}

	@Test
	public void test8() throws Exception {
		System.out.println("向json中添加屬性");
		String json = "{\"id\":\"1\",\"name\":\"Json技術\"}";
		String propertyName = "desc";
		Object propertyValue = "json各類技術的調研";
		JsonParser jsonParser = new JsonParser();
		JsonElement element = jsonParser.parse(json);
		JsonObject jsonObj = element.getAsJsonObject();
		jsonObj.addProperty(propertyName, new Gson().toJson(propertyValue));
		json = jsonObj.toString();
		System.out.println("json:" + json);
		System.out.println();
	}

	@Test
	public void test9() throws Exception {
		System.out.println("修改json中的屬性");
		String json = "{\"id\":\"1\",\"name\":\"Json技術\"}";
		String propertyName = "name";
		Object propertyValue = "json各類技術的調研";
		JsonParser jsonParser = new JsonParser();
		JsonElement element = jsonParser.parse(json);
		JsonObject jsonObj = element.getAsJsonObject();
		jsonObj.remove(propertyName);
		jsonObj.addProperty(propertyName, new Gson().toJson(propertyValue));
		json = jsonObj.toString();
		System.out.println("json:" + json);
		System.out.println();
	}

	@Test
	public void test10() throws Exception {
		System.out.println("判斷json中是否有屬性");
		String json = "{\"id\":\"1\",\"name\":\"Json技術\"}";
		String propertyName = "name";
		boolean isContains = false;
		JsonParser jsonParser = new JsonParser();
		JsonElement element = jsonParser.parse(json);
		JsonObject jsonObj = element.getAsJsonObject();
		isContains = jsonObj.has(propertyName);
		System.out.println("isContains:" + isContains);
		System.out.println();
	}

	@Test
	public void test11() throws Exception {
		System.out.println("json中日期格式的處理");
		GsonBuilder builder = new GsonBuilder();
		builder.setDateFormat("yyyy-MM-dd");
		Gson gson = builder.create();
		User user = new User();
		user.setBirthday(new Date());
		String json = gson.toJson(user);
		System.out.println("json:" + json);
		System.out.println();
	}

	@Test
	public void test12() throws Exception {
		System.out.println("json中對於Html的轉義");
		GsonBuilder builder = new GsonBuilder();
		builder.disableHtmlEscaping();
		Gson gson = builder.create();
		System.out.println();
	}
}

運行以下:性能

判斷json中是否有屬性
isContains:true

json中日期格式的處理
json:{"age":0,"birthday":"2016-11-14"}

json中對於Html的轉義

Bean->轉換爲JSON字符串:
{"id":1,"age":20,"userName":"AA","birthday":"Nov 14, 2016 5:14:19 PM"}

字符串->轉換成Bean對象
User [id=1, age=20, userName=AA, birthday=Mon Nov 14 16:52:38 CST 2016]

json轉換複雜的bean,好比List,Set,Map:

格式化JSON:
[
  {
    "id": "1",
    "name": "Json技術"
  },
  {
    "id": "2",
    "name": "java技術"
  }
]

判斷字符串是不是json,經過捕捉的異常來判斷是不是json
false:false

從json串中獲取屬性
propertyValue:"Json技術"

除去json中的某個屬性
json:{"name":"Json技術"}

向json中添加屬性
json:{"id":"1","name":"Json技術","desc":"\"json各類技術的調研\""}

修改json中的屬性
json:{"id":"1","name":"\"json各類技術的調研\""}

更多關於GSON的使用方法,請參考【這裏面介紹的很詳細】:http://www.jianshu.com/p/e740196225a4

相關文章
相關標籤/搜索