需要导入gson-xxx.jar包

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

常用的类有三个:com.google.gson.JsonElement抽象类及其两个子类com.google.gson.JsonObject 和 com.google.gson.JsonArray

发挥做用的也就两个方法:

Gson gson=new Gson();

String jsonStr=gson.toJson(Object src) ;//可以传普通JavaBean、Map<String,Object>、List<JavaBean>、List<Object>

T gson.fromJson(String json, Class<T> classOfT)   //可以把json字符串转为普通JavaBean

1.普通JavaBean与json字符串及JsonObject互转:

@Test
	public void testBeanJSON() {
		Gson gson = new Gson();
		Person person = new Person();
		person.setId(1);
		person.setName("zhangsan");
		person.setEmail("zhangsan@126.com");
		// 把JavaBean转为json字符串
		String json = gson.toJson(person);
		System.out.println(json);
		// 把json字符串转为JavaBean
		person = gson.fromJson(json, Person.class);
		System.out.println(person);
		// 把json字符串转为JsonObject
		JsonObject jsonObject = (JsonObject) gson.fromJson(json, JsonElement.class);
		System.out.println(jsonObject);
		String jsonStr = jsonObject.toString();
		System.out.println(jsonStr.equals(json));
		JsonPrimitive nameJsonPrimitive = (JsonPrimitive) jsonObject.get("name");
		System.out.println(nameJsonPrimitive);
		String name = nameJsonPrimitive.getAsString();
		System.out.println(name);
	}
//打印结果:
//{"id":1,"name":"zhangsan","email":"zhangsan@126.com"}
//Person [id=1, name=zhangsan, email=zhangsan@126.com]
//{"id":1,"name":"zhangsan","email":"zhangsan@126.com"}
//true
//"zhangsan"
//zhangsan

把json字符串转成JavaBean时,fromJson第二个参数传的是Entity.class;

把json字符串转换成JsonObject时,fromJson第二个参数传的是JsonElement.class,不能传JsonObject.class,否则返回的JsonObject是空的JsonObject对象。

如果想得到JsonObject对象的某个属性值,要调用两个级联方法.get(String memberName).getAsString()。

2.Map与json字符串互转:

@Test
	public void testMapJSON() {
		Gson gson = new Gson();
		Map<String, Object> map = new HashMap<String, Object>();
		map.put("id", 1);
		map.put("name", "zhangsan");
		map.put("ema", "zhangsan@126.com");
		String json = gson.toJson(map);
		System.out.println(json);
		map = gson.fromJson(json, Map.class);
		System.out.println(map);
		System.out.println(map.get("id"));
		System.out.println(map.get("id").getClass().getName());
	}
//打印结果:
//{"name":"zhangsan","ema":"zhangsan@126.com","id":1}
//{name=zhangsan, ema=zhangsan@126.com, id=1.0}
//1.0
//java.lang.Double

值得注意的是,原来map中id键对应的值类型是int,但是转成json字符串再转回来后,int类型变为Double类型了,这值得重视。如果需要int型,还需要利用double.intValue()方法转为int型。

3.List<Object>或List<JavaBean>与json字符串互转:

@Test
	public void testListJson() {
		// List<Object>与Json互转
		List<Object> list = new ArrayList<Object>();
		for (int i = 0; i < 2; i++) {
			list.add(i);
			list.add("element" + i);
		}
		System.out.println(list);
		Gson gson = new Gson();
		String json = gson.toJson(list);
		System.out.println(json);
		list = gson.fromJson(json, List.class);
		for (int i = 0; i < list.size(); i++) {
			Object o = list.get(i);
			System.out.println(o);
			System.out.println(o.getClass().getName());
		}

		// List<JavaBean>与Json互转
		List<Person> PersonList = new ArrayList<Person>();
		for (int i = 1; i < 3; i++) {
			Person person = new Person();
			person.setId(i);
			person.setName("zhangsan" + i);
			person.setEmail("zhangsan@126.com" + i);
			PersonList.add(person);
		}
		String PersonJsonStr = gson.toJson(PersonList);
		System.out.println(PersonJsonStr);
		List<LinkedHashMap<String, Object>> list2 = gson.fromJson(PersonJsonStr, List.class);
		System.out.println(list2);
		for (LinkedHashMap<String, Object> l : list2) {
			System.out.println(l.getClass().getName());
			Double doubleId = (Double) l.get("id");
			int intId = doubleId.intValue();
			System.out.println(intId);
		}

		// 利用TypeToken,List<JavaBean>与Json互转
		Type type = new TypeToken<List<Person>>() {
		}.getType();
		System.out.println("type: " + type);
		String PersonJsonStr2 = gson.toJson(PersonList, type);
		System.out.println(PersonJsonStr2.equals(PersonJsonStr));
		List<Person> users = gson.fromJson(PersonJsonStr, type);
		System.out.println(users);
	}
}
/*
[0, element0, 1, element1]
[0,"element0",1,"element1"]
0.0
java.lang.Double
element0
java.lang.String
1.0
java.lang.Double
element1
java.lang.String
[{"id":1,"name":"zhangsan1","email":"zhangsan@126.com1"},{"id":2,"name":"zhangsan2","email":"zhangsan@126.com2"}]
[{id=1.0, name=zhangsan1, email=zhangsan@126.com1}, {id=2.0, name=zhangsan2, email=zhangsan@126.com2}]
java.util.LinkedHashMap
1
java.util.LinkedHashMap
2
type: java.util.List<com.maizuo.entiti.Person>
true
[Person [id=1, name=zhangsan1, email=zhangsan@126.com1], Person [id=2, name=zhangsan2, email=zhangsan@126.com2]]
*/ 

经过实际测试知,不管是转换List<Object>还是List<JavaBean>,当把字符串反序列化为list时,gson.fromJson(String json, Class<T> classOfT)方法的第二个参数必需传List.class,

当转换List<JavaBean>时,有2种方法:

第一种方法,gson.fromJson(String json, Class<T> classOfT)方法的第二个参数传List.class。此时,返回的list中的元素不是JavaBean,而是Map,具体来说是java.util.LinkedHashMap类型的。所以如果想得到一个个JavaBean,还需从Map中取出键值对,然后利用构造器封装成JavaBean。

第二种方法,gson.fromJson(String json, Class<T> classOfT)方法的第二个参数传Type对象(Type type = new TypeToken<List<Person>>() {

        }.getType(); //写法好怪,不必强记,记住有这回事就好)。此时 ,返回的List对象的元素就是JavaBean对象。

实际用哪种反序列化方法,看具体需求。

4.数组与json字符串互转:

@Test
	public void testArrayJson() {
		// 将数组转JSON
		int[] number = { 1, 2, 3, 4, 5 };
		Gson gson = new Gson();
		String numberjson = gson.toJson(number);
		System.out.println(numberjson);
		// 将JSON转数组
		number = gson.fromJson(numberjson, int[].class);
		for (int i = 0; i < number.length; i++) {
			System.out.println("第" + (i + 1) + "个值是: " + number[i]);
		}
	}
/*
打印结果:
[1,2,3,4,5]
第1个值是: 1
第2个值是: 2
第3个值是: 3
第4个值是: 4
第5个值是: 5
*/

json处理三部曲之第三曲:利用Gson处理json的更多相关文章

  1. 利用Gson将JSON数据进行格式化(pretty print)

    我们可以利用Gson包将String类型的JSON数据进行格式化. Gson gson = new GsonBuilder().setPrettyPrinting().create(); JsonPa ...

  2. json处理三部曲之第一曲:利用json-lib-xxx.jar处理json

    json-lib-xxx.jar包必需5个依赖包(实测): ezmorph-xxx.jar commons-lang-xxx.jar commons-beanutils-xxx.jar commons ...

  3. Android 利用 gson 将 json 转成 对象object 集合list

    1.build.gradle 中引入gson compile 'com.google.code.gson:gson:2.8.5' 2.将后台返回的json数据转对象.List.时间格式与后台返回的时间 ...

  4. Java 利用Gson将json字符串转换为List<Map<String, String>>

    json字符串类似于: [ { "userPhone": "123", "userNo": "123-2", " ...

  5. Android 利用Gson生成或解析json

    目前手机端和服务端数据交流格式一般是json,而谷歌提供了Gson来解析json.下载Gson:https://code.google.com/p/google-gson/ 下载的放在lib并导入,若 ...

  6. Amdroid示例:利用Gson生成或解析json

    转自:http://www.cnblogs.com/liqw/p/4266209.html 目前手机端和服务端数据交流格式一般是json,而谷歌提供了Gson来解析json.下载Gson:https: ...

  7. Gson解析json数据

    1.解析单个对象 JSON字符串如下 [ { "formatDate":"2015-10-28", "date":"2015\u5 ...

  8. 解析JSON有俩种方式:JSONObject和GSON

    JSONObject: //JSONObject解析JSON文件 private void parseJSONWithJSONObject(String json_data) { try { JSON ...

  9. Java下利用Jackson进行JSON解析和序列化

    Java下利用Jackson进行JSON解析和序列化   Java下常见的Json类库有Gson.JSON-lib和Jackson等,Jackson相对来说比较高效,在项目中主要使用Jackson进行 ...

随机推荐

  1. linode开通Paypal付款方式

    vps服务器品牌linode近期新闻不断.今天是linode成立13周年,全部套餐免费升级翻倍内存,所以现在linode最低配置套餐内存是2GB,每月2TB流量,40Gb机房带宽,非常超值. 长期以来 ...

  2. iOSAPP添加启动页

    如果你在开发过程中出现屏幕显示内容比例不正常或者显示不全的问题,你发现不是代码或者约束的问题,那么很可能是启动页没有添加或者添加不全的原因,下面配一张问题图片上下黑屏 添加启动页步骤如下图 (1) ( ...

  3. LightOJ 1095 Arrange the Numbers-容斥

    给出n,m,k,求1~n中前m个正好有k个在原来位置的种数(i在第i个位置) 做法:容斥,先选出k个放到原来位置,然后剩下m-k个不能放到原来位置的,用0个放到原来位置的,有C(m-k,0)*(n-k ...

  4. C++笔记(to be cont'd)

    最近在看这个:LearnCpp 主要是一些我自己容易忽视的地方 记一些笔记在下面,还有错漏地方请不吝赐教 CH1.10 Preprocessing The preprocessor copies th ...

  5. 【转载】javadoc学习笔记和可能的注意细节

    转载自:http://www.cnblogs.com/xt0810/p/3630996.html [前面的话] 这次开发项目使用jenkins做持续集成,PMD检查代码,Junit做单元测试,还会自动 ...

  6. Windows下NexusPHP搭建PT站过程

    搭建环境:Win7+XAMPP(5.5) 网站根目录: D:\IT\XAMPP5.5\htdocs\ 1 下载源码程序http://sourceforge.net/projects/nexusphp/ ...

  7. openstack私有云布署实践【4.2 上层代理haproxy+nginx配置 (办公网测试环境)】

    续上一节说明 一开始我也是使用haproxy来做的,但后来方式改了,是因为物理机controller的高配置有些浪费,我需要1组高可用的上层nginx代理服务器来实现其它域名80代理访问,很多办公网测 ...

  8. Generating Faces with Deconvolution Networks

    用深度学习做人脸合成,website:https://zo7.github.io/blog/2016/09/25/generating-faces.html 受启发于 Learning to Gene ...

  9. 关于requirejs中的define的原理理解

    我们已经了解到模块模式是为单例创建私有变量和特权方法的. 一个最基本的例子: var foo=(function(){ var something='cool', var another=[1,2,3 ...

  10. Windows后渗透

    My 命令行下收集主机信息 使用wmic识别安装到系统中的补丁情况: wmic qfe get description,installedOn 识别正在运行的服务: sc query type= se ...