文档章节

Google Gson的使用方法及JSON 技术对比

开源中国首席灵魂师
 开源中国首席灵魂师
发布于 2016/11/14 17:20
字数 1715
阅读 344
收藏 4

  一 、各个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在功能和性能上面都不能满足现在互联网化的需求。

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有所差距。

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

 

二、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>

三、Gson的使用

首先定义一个类:

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

© 著作权归作者所有

开源中国首席灵魂师
粉丝 19
博文 44
码字总数 41547
作品 0
徐汇
程序员
私信 提问
Json解析速度比较-Android API、Gson、Fastjson

IOS现成的API里的json解析速度非常快,这里就不说了,今天对比一下Android里面json的解析库。 首先第一个是Android API里面自带的json解析,其次是谷歌提供的Gson解析库(开源),其次是在网...

未来程序员
2018/06/29
0
0
json解析—Gson以及GsonFormat插件的运用

最近开始慢慢做毕业设计了,遇到一个功能是获取天气预报的,我选择的是和风天气的api,返回的是JSON数据,所以遇到了解析JSON的问题 首先简单说下JSON,JSON(JavaScript Object Notation)是...

chestnut_egg
2017/11/22
0
0
json处理,json、object的相互转化

用 FastJson将Json转换Bean ,用Jackson或Gson将Bean 转FastJson 要求能够支持获取Object中的Object,即支持深层嵌套的Object解析,此外json、Object间的相互转换要快速。 参考:各个JSON技术...

刘阳0292
2017/07/09
0
0
[Json框架选型]Android开发中应该使用哪一种主流json框架?

前言 前段时间@寒江不钓同学针对国内Top500和Google Play Top200 Android应用做了全面的分析(具体分析报告见文末的参考资料),其中有涉及到对主流应用使用json框架Gson、FastJson、Jackson...

张明云
2016/08/08
0
0
【Java】各个JSON技术的比较

一 、各个JSON技术的简介和优劣 1. json-lib json-lib最开始的也是应用最广泛的json解析工具,json-lib 不好的地方确实是依赖于很多第三方包,包括commons-beanutils.jar,commons-collectio...

鴿神丶
2016/07/22
127
0

没有更多内容

加载失败,请刷新页面

加载更多

64.监控平台介绍 安装zabbix 忘记admin密码

19.1 Linux监控平台介绍 19.2 zabbix监控介绍 19.3/19.4/19.6 安装zabbix 19.5 忘记Admin密码如何做 19.1 Linux监控平台介绍: 常见开源监控软件 ~1.cacti、nagios、zabbix、smokeping、ope...

oschina130111
昨天
64
0
当餐饮遇上大数据,嗯真香!

之前去开了一场会,主题是「餐饮领袖新零售峰会」。认真听完了餐饮前辈和新秀们的分享,觉得获益匪浅,把脑子里的核心纪要整理了一下,今天和大家做一个简单的分享,欢迎感兴趣的小伙伴一起交...

数澜科技
昨天
26
0
DNS-over-HTTPS 的下一代是 DNS ON BLOCKCHAIN

本文作者:PETER LAI ,是 Diode 的区块链工程师。在进入软件开发领域之前,他主要是在做工商管理相关工作。Peter Lai 也是一位活跃的开源贡献者。目前,他正在与 Diode 团队一起开发基于区块...

红薯
昨天
41
0
CC攻击带来的危害我们该如何防御?

随着网络的发展带给我们很多的便利,但是同时也带给我们一些网站安全问题,网络攻击就是常见的网站安全问题。其中作为站长最常见的就是CC攻击,CC攻击是网络攻击方式的一种,是一种比较常见的...

云漫网络Ruan
昨天
27
0
实验分析性专业硕士提纲撰写要点

为什么您需要研究论文的提纲? 首先当您进行研究时,您需要聚集许多信息和想法,研究论文提纲可以较好地组织你的想法, 了解您研究资料的流畅度和程度。确保你写作时不会错过任何重要资料以此...

论文辅导员
昨天
44
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部