需要导入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 */