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
相比json-lib框架,Jackson所依赖的jar包较少,简单易用而且性能也要相对高些。并且Jackson社区相对比较活跃,更新速度也比较快。Jackson对于复杂类型的json转换bean会出现问题,一些集合Map,List的转换出现问题。Jackson对于复杂类型的bean转换Json,转换的json格式不是标准的Json格式算法
Gson是目前功能最全的Json解析神器,Gson当初是为因应Google公司内部需求而由Google自行研发而来,
但自从在2008年五月公开发布初版后已被许多公司或用户应用。Gson的应用主要为toJson与fromJson两个转换函数,无依赖,不须要例外额外的jar,可以直接跑在JDK上。而在使用这种对象转换以前需先建立好对象的类型以及其成员才能成功的将JSON字符串成功转换成相对应的对象。类里面只要有get和set方法,Gson彻底能够将复杂类型的json到bean或bean到json的转换,是JSON解析的神器。Gson在功能上面无可挑剔,可是性能上面比FastJson有所差距。json
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
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