Gson與Fastjson兩種Json決議神器保姆級使用攻略
一、為什么使用Gson與Fastjson?
Ajax異步訪問資料需要前端(js)和服務器端(java)進行傳輸資料,但是Ajax只能識別字串,但是服務器里面的是一個java物件,需要將java物件轉換為字串(使用json ),Gson與Fastjson就是將java物件轉換json串的主流工具類!
二、服務器端java物件轉化json串
1、Ajax異步傳遞資料為什么使用json?
1. 本質就是一個字串
2. java和js都支持json形式字串
所以我們需要將java物件轉換為json串,在前端將json串轉化為js物件
2、常用的json形式資料轉換工具(服務器端java轉json)
Gson(google的),**Fastjson(阿里的)轉換工具** ,我們目前主要使用**Fastjson**
3、Google的Gson
Gson是目前功能最全的Json決議神器,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庫,
三、阿里巴巴的Fastjson 的使用(主流 )
1、在maven專案中匯入Fastjson 的依賴
(注:maven選擇依賴小攻略:搜索maven,選擇使用人數最高的一般都是用于企業開發使用的)
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
2、創建物體類User
public class User {
private Integer id;
private String name;
private String password;
private Date birthday;
3、使用FastJson工具類轉換物件
(1)單個java物件轉換為JSON串
/**
* 轉換單個物件
*/
@Test
public void FastJson() {
//1.創建一個物件
User user = new User(1, "王恒杰", "123456", new Date());
// 列印物件
System.out.println("User物件"+user);
/**
* 使用fastJson將User物件轉換為json形式的字串
* 引數:要轉化的物件
* 回傳值:json字串
*/
String json = JSONObject.toJSONString(user);
System.out.println("json串"+json);
}
- 轉換后結果

注:我們會發現物件轉換為JSON串時,日期轉化不會正常顯示 ,他會顯示為毫秒!FastJson專門提供一個API解決日期格式轉化 問題!
(2)java物件轉換為JSON串日期轉化方案
/**
* java物件轉換為JSON串日期轉化方案
*/
@Test
public void FastJson() {
//1.創建一個物件
User user = new User(1, "王恒杰", "123456", new Date());
// 列印物件
System.out.println("User物件"+user);
/**
* 2.使用fastJson將User物件轉換為json形式的字串
* 引數:要轉化的物件
* 回傳值:json字串
*/
String json1 = JSONObject.toJSONString(user);
System.out.println("json串"+json1);
/**
* 3.fastJson日期格式轉化API
* 引數1:要轉化的物件
* 引數2:日期轉化 可以寫成 yyy-mm-dd && yyyy-mm-dd hh:mm:ss兩種
* 回傳值:日期格式化后的json串
*/
String json2 = JSONObject.toJSONStringWithDateFormat(user, "yyyy-mm-dd hh:mm:ss");
System.out.println("日期格式化后的json串"+json2);
}
- 轉換后結果

(3)List集合物件轉換為JSON串
@Test
public void ListByFastJsonTest(){
//1.創建List集合
ArrayList<User> list = new ArrayList<>();
//2,添加資料
list.add(new User(1, "王恒杰1", "123456", new Date()));
list.add(new User(2, "王恒杰2", "123456", new Date()));
list.add(new User(3, "王恒杰3", "123456", new Date()));
list.add(new User(4, "王恒杰4", "123456", new Date()));
//通過fastJson將List集合轉換為json串
String listUser = JSONObject.toJSONStringWithDateFormat(list, "yyyy-mm-dd");
System.out.println(listUser);
}
- 轉換后結果

(4)map集合物件轉換為JSON串
@Test
public void MapByFastJsonTest() {
//1.創建map集合
Map<String, String> map = new HashMap<>();
//2,添加資料
map.put("1號選手", "王恒杰1");
map.put("2號選手", "王恒杰2");
map.put("3號選手", "王恒杰3");
map.put("4號選手", "王恒杰4");
//通過fastJson將map集合轉換為json串
String json = JSONObject.toJSONString(map);
System.out.println(json);
}
- 轉換后結果

(5)使用注解的方法解決日期格式
- 物體類User:

- 測驗方法:
@Test
public void DateByFastJsonTest(){
User user = new User();
user.setBirthday(new Date());
String json = JSONObject.toJSONString(user);
System.out.println(json);
}
- 轉換后結果

四、Google的Gson 的使用(功能最全 )
先對與fastJson來說:Gson在功能上面無可挑剔,但是性能上面比FastJson有所差距,因為我很少使用,所以Gson我就測驗了一個!
1、在maven專案中匯入Fastjson 的依賴
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.5</version>
</dependency>
2、創建物體類User
public class User {
private Integer id;
private String name;
private String password;
private Date birthday;
3、單個java物件轉換為JSON串:toJson
/**
* Gson轉換單個物件
*/
@Test
public void Gson() {
//1.創建一個物件
User user = new User(1, "王恒杰", "123456", new Date());
// 列印物件
System.out.println("User物件" + user);
/**
* 2.使用Gson將User物件轉換為json形式的字串
*/
Gson gson = new Gson();
String json = gson.toJson(user);
System.out.println(json);
}
- 轉換后結果

4、java物件轉換為JSON串日期轉化方案
@Test
public void DateGson() {
//1.創建一個物件
User user = new User(1, "王恒杰", "123456", new Date());
// 列印物件
System.out.println("User物件" + user);
/**
* 2.使用Gson將User物件轉換為json形式的字串
*/
GsonBuilder builder = new GsonBuilder();
Gson gson = builder.setDateFormat("yyyy-mm-dd").create();
String json = gson.toJson(user);
System.out.println(json);
}
- 轉換后結果

五、如何選擇Gson || FastJson
在專案選型的時候可以使用Google的Gson和阿里巴巴的FastJson兩種并行使用,
如果只是功能 要求,沒有性能 要求,可以使用google的Gson,
如果有性能上面的要求可以使用Gson將bean轉換json確保資料的正確,使用FastJson將Json轉換Bean
六、前端將json串轉換為js中的json物件
//json形式字串:xhr.responseText
1. 轉換方式1: var JsJsonObject=JSON.parse(xhr.responseText);
2. 轉換方式2: var JsJsonObject=eval("+(xhr.responseText)+");
JSJsonObject屬性名 獲取對應屬性值
- 前后端json轉化總結:
1. java物件:使用json轉換工具(FastJson) 將物件轉換為json串 再進行轉換
2. js: 將接收到的json字串轉換為js中的json物件
七、FastJson實用案例
1、案例要求:單擊展示單個用戶資訊 & 驗證用戶名是否存在

2、具體實作
(1)技術選型:
Servlet+html+Ajax+js(主要展示ajax&FastJson效果),Ajax我們使用的是原生js實作
(2)所需要依賴
<!--Servlet依賴主要用于后端使用 注意使用Servlet的注解配置路徑一定要3以后的版本-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<!--用要用于跳轉頁面時使用和相對路徑-->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.1</version>
</dependency>
<!--FastJson工具所需依賴-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
(3)物體類User
public class User {
private Integer id;
private String name;
private String password;
private Date birthday;
(3)html
<body>
用戶名:<input type="text" id="name" name="name"><span id="msg"></span></br>
<input type="submit" id="btn" value="輸入姓名點擊展示用戶資訊">
</body>
(4)ajax實作資料傳輸
<script type="text/javascript">
<%--先加載頁面后執行js物件--%>
window.onload = function () {
var name = document.getElementById("name");
//獲取
var nameValue = name.value;
//為按鈕系結移出輸入視窗事件
name.onblur = function () {
// 1.創建Ajax異步請求物件
let xhr = new XMLHttpRequest();
//2.發送請求
xhr.open("post", "${pageContext.request.contextPath}/checkName");
xhr.setRequestHeader("content-type", "application/x-www-form-urlencoded");
xhr.send("name=" + nameValue);
//3.處理回應 onreadystatechange函式會在readyState屬性發生改變時被呼叫
xhr.onreadystatechange = function () {
if (xhr.readyState == 4) {
//4.獲取回應更新頁面區域
if (xhr.status == 200) {
var msg = document.getElementById("msg");
msg.innerText = xhr.responseText
}
}
}
}
var btn = document.getElementById("btn");
btn.onclick = function () {
var xhr = new XMLHttpRequest();
xhr.open("post", "${pageContext.request.contextPath}/user");
xhr.setRequestHeader("content-type", "application/x-www-form-urlencoded");
xhr.send("name=" + nameValue);
xhr.onreadystatechange = function () {
if (xhr.readyState == 4 && xhr.status == 200) {
//列印結果 json形式的字串
console.log(xhr.responseText);
//將接收的json字串轉化為js中json物件
var user = JSON.parse(xhr.responseText);
console.log(user);
}
}
}
}
</script>
(5)servlet實作后端
- 單擊展示單個用戶資訊
@WebServlet("/checkName")
public class CheckServlet extends HttpServlet {
@Override
public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//統一編碼格式
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;setchar=utf-8");
response.setCharacterEncoding("utf-8");
//接收資料
String name = request.getParameter("name");
User user = new User(1, "王恒杰", "123456", new Date());
//處理業務
if (user.getName().equals(name)) {
response.getWriter().print("用戶可以被查詢到!");
} else {
//驗證用戶名是否存在
response.getWriter().print("用戶不存在");
}
}
}
- 驗證用戶名是否存在
@WebServlet("/user")
public class UserServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//統一編碼格式
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;setchar=utf-8");
response.setCharacterEncoding("utf-8");
//接收資料
String name = request.getParameter("name");
User user = new User(1, "王恒杰", "123456", new Date());
//處理業務
// 回應輸出流 向客戶端回應內容
String jsonUser = JSONObject.toJSONStringWithDateFormat(user, "yyyy-mm-dd");
response.getWriter().print(jsonUser);
}
}
效果展示:

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/340726.html
標籤:java
上一篇:Java-方法的使用、多載與遞回
