需要导入gson-xxx.jar包

  1. <dependency>
  2. <groupId>com.google.code.gson</groupId>
  3. <artifactId>gson</artifactId>
  4. <version>2.0</version>
  5. </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互转:

  1. @Test
  2. public void testBeanJSON() {
  3. Gson gson = new Gson();
  4. Person person = new Person();
  5. person.setId(1);
  6. person.setName("zhangsan");
  7. person.setEmail("zhangsan@126.com");
  8. // 把JavaBean转为json字符串
  9. String json = gson.toJson(person);
  10. System.out.println(json);
  11. // 把json字符串转为JavaBean
  12. person = gson.fromJson(json, Person.class);
  13. System.out.println(person);
  14. // 把json字符串转为JsonObject
  15. JsonObject jsonObject = (JsonObject) gson.fromJson(json, JsonElement.class);
  16. System.out.println(jsonObject);
  17. String jsonStr = jsonObject.toString();
  18. System.out.println(jsonStr.equals(json));
  19. JsonPrimitive nameJsonPrimitive = (JsonPrimitive) jsonObject.get("name");
  20. System.out.println(nameJsonPrimitive);
  21. String name = nameJsonPrimitive.getAsString();
  22. System.out.println(name);
  23. }
  24. //打印结果:
  25. //{"id":1,"name":"zhangsan","email":"zhangsan@126.com"}
  26. //Person [id=1, name=zhangsan, email=zhangsan@126.com]
  27. //{"id":1,"name":"zhangsan","email":"zhangsan@126.com"}
  28. //true
  29. //"zhangsan"
  30. //zhangsan

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

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

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

2.Map与json字符串互转:

  1. @Test
  2. public void testMapJSON() {
  3. Gson gson = new Gson();
  4. Map<String, Object> map = new HashMap<String, Object>();
  5. map.put("id", 1);
  6. map.put("name", "zhangsan");
  7. map.put("ema", "zhangsan@126.com");
  8. String json = gson.toJson(map);
  9. System.out.println(json);
  10. map = gson.fromJson(json, Map.class);
  11. System.out.println(map);
  12. System.out.println(map.get("id"));
  13. System.out.println(map.get("id").getClass().getName());
  14. }
  15. //打印结果:
  16. //{"name":"zhangsan","ema":"zhangsan@126.com","id":1}
  17. //{name=zhangsan, ema=zhangsan@126.com, id=1.0}
  18. //1.0
  19. //java.lang.Double

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

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

  1. @Test
  2. public void testListJson() {
  3. // List<Object>与Json互转
  4. List<Object> list = new ArrayList<Object>();
  5. for (int i = 0; i < 2; i++) {
  6. list.add(i);
  7. list.add("element" + i);
  8. }
  9. System.out.println(list);
  10. Gson gson = new Gson();
  11. String json = gson.toJson(list);
  12. System.out.println(json);
  13. list = gson.fromJson(json, List.class);
  14. for (int i = 0; i < list.size(); i++) {
  15. Object o = list.get(i);
  16. System.out.println(o);
  17. System.out.println(o.getClass().getName());
  18. }
  19.  
  20. // List<JavaBean>与Json互转
  21. List<Person> PersonList = new ArrayList<Person>();
  22. for (int i = 1; i < 3; i++) {
  23. Person person = new Person();
  24. person.setId(i);
  25. person.setName("zhangsan" + i);
  26. person.setEmail("zhangsan@126.com" + i);
  27. PersonList.add(person);
  28. }
  29. String PersonJsonStr = gson.toJson(PersonList);
  30. System.out.println(PersonJsonStr);
  31. List<LinkedHashMap<String, Object>> list2 = gson.fromJson(PersonJsonStr, List.class);
  32. System.out.println(list2);
  33. for (LinkedHashMap<String, Object> l : list2) {
  34. System.out.println(l.getClass().getName());
  35. Double doubleId = (Double) l.get("id");
  36. int intId = doubleId.intValue();
  37. System.out.println(intId);
  38. }
  39.  
  40. // 利用TypeToken,List<JavaBean>与Json互转
  41. Type type = new TypeToken<List<Person>>() {
  42. }.getType();
  43. System.out.println("type: " + type);
  44. String PersonJsonStr2 = gson.toJson(PersonList, type);
  45. System.out.println(PersonJsonStr2.equals(PersonJsonStr));
  46. List<Person> users = gson.fromJson(PersonJsonStr, type);
  47. System.out.println(users);
  48. }
  49. }
  50. /*
  51. [0, element0, 1, element1]
  52. [0,"element0",1,"element1"]
  53. 0.0
  54. java.lang.Double
  55. element0
  56. java.lang.String
  57. 1.0
  58. java.lang.Double
  59. element1
  60. java.lang.String
  61. [{"id":1,"name":"zhangsan1","email":"zhangsan@126.com1"},{"id":2,"name":"zhangsan2","email":"zhangsan@126.com2"}]
  62. [{id=1.0, name=zhangsan1, email=zhangsan@126.com1}, {id=2.0, name=zhangsan2, email=zhangsan@126.com2}]
  63. java.util.LinkedHashMap
  64. 1
  65. java.util.LinkedHashMap
  66. 2
  67. type: java.util.List<com.maizuo.entiti.Person>
  68. true
  69. [Person [id=1, name=zhangsan1, email=zhangsan@126.com1], Person [id=2, name=zhangsan2, email=zhangsan@126.com2]]
  70. */

经过实际测试知,不管是转换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字符串互转:

  1. @Test
  2. public void testArrayJson() {
  3. // 将数组转JSON
  4. int[] number = { 1, 2, 3, 4, 5 };
  5. Gson gson = new Gson();
  6. String numberjson = gson.toJson(number);
  7. System.out.println(numberjson);
  8. // 将JSON转数组
  9. number = gson.fromJson(numberjson, int[].class);
  10. for (int i = 0; i < number.length; i++) {
  11. System.out.println("第" + (i + 1) + "个值是: " + number[i]);
  12. }
  13. }
  14. /*
  15. 打印结果:
  16. [1,2,3,4,5]
  17. 第1个值是: 1
  18. 第2个值是: 2
  19. 第3个值是: 3
  20. 第4个值是: 4
  21. 第5个值是: 5
  22. */

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. Eclipse中安装Jdk和配置Python

    要借助Eclipse辅助工作,之前安装配置都是同事帮忙弄的,今天有空来整理一下安装配置步骤 一.安装JDK1.下载JDK,安装JDK,安装完毕,配置JDK环境变量  1)我的电脑右键-属性-高级-点击 ...

  2. 6、iOS快速枚举

    今天在写程序的时候想在当前视图跳转的时候释放掉当前视图上面add的一些子视图.因为add的子视图有些是在别的类里面add进来的,当前页面不知道自己当前有哪几个类型的子视图.这样,我就想到了用循环遍历来 ...

  3. NYOJ-102 次方求模

    次方求模 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 求a的b次方对c取余的值   输入 第一行输入一个整数n表示测试数据的组数(n<100)每组测试只有一 ...

  4. java中转换json方式(JSONArray,JSONObject),json解析

    package com.yunos.tv.video.resource.controller.web; import java.util.ArrayList; import java.util.Has ...

  5. 一个初学者的辛酸路程-socket编程-8

    前言: 你会发现会网络是多么幸福的事情 主要内容: socket 概念: socket本质上就是2台网络互通的电脑之间,架设一个通道,两台电脑通过这个通道来实现数据的互相传递.我们知道网络通信都是基于 ...

  6. python多进程,以及进程池并发

    模拟多进程 #!/usr/bin/env python#-*- coding:utf-8 -*-import timefrom multiprocessing import Process def s ...

  7. .net中读取xml文件中节点的所有属性信息

    功能描述: 将数据以xml的格式记录成配置文件,需要获取配置文件中的数据时,则获取对应的配置文件,读取配置文件里对应节点的所有属性. 逻辑实现: 1.将数据配置好在xml文件中. 2.获取xml文件中 ...

  8. 利用poi向excle写入数据

    import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import org ...

  9. MEAN全栈开发实践

  10. Android 发送HTTP GET POST 请求以及通过 MultipartEntityBuilder 上传文件(二)

    Android 发送HTTP GET POST 请求以及通过 MultipartEntityBuilder 上传文件第二版 上次粗略的写了相同功能的代码,这次整理修复了之前的一些BUG,结构也大量修改 ...