json簡介
JSON是一種數據交換格式。JSON是基於文本的,輕量級的,通常被認爲易於讀/寫。
JSON 特性包括以下內容:
- 靈活性,允許程序員定義鍵。
- 內容較少,因爲內容主要是數據。
- 便攜式數據。
- 非專有的。
- Web 服務的通用和便捷格式。
- 通常在 Web 應用程序開發中使用,JSON 可以用作任何將信息存儲爲文本的應用程序的數據格式。
一些人優先使用 JSON 作爲數據交換格式,因爲它不那麼冗長,工作速度快,減少了數據大小並簡化了文檔處理。它廣泛用於 Web 開發,特別是因爲它可以在可能不兼容的技術之間無縫地傳輸信息。例如,它可能涉及在 UNIX 上運行的 Java 應用程序或在 Windows 上運行的 C#應用程序。
JSON 鍵/值對
JSON 鍵值對是用來保存 JS 對象的一種方式,和 JS 對象的寫法也大同小異,鍵/值對組合中的鍵名寫在前面並用雙引號 “” 包裹,使用冒號 : 分隔,然後緊接着值:
1 {"firstName":"John"}
這很容易理解,等價於這條 JavaScript 語句:
2 {firstName:"John"}
JSON 與 JS 對象的關係
很多人搞不清楚 JSON 和 Js 對象的關係,甚至連誰是誰都不清楚。其實,可以這麼理解:JSON 是 JS 對象的字符串表示法,它使用文本表示一個 JS 對象的信息,本質是一個字符串。如
1 var obj={a:'Hello',b:'World'};//這是一個對象,注意鍵名也是可以使用引號包裹的
2 var json='{"a":"Hello","b":"World"}';//這是一個JSON字符串,本質是一個字符串
注:1 鍵和值都要用雙引號包裹; 2 和數組不同,不能有多餘的逗號
Controller類有什麼返回形式?
Controller類裏面一般有兩大返回值:
1. rest api的json輸出
科普一下:什麼是rest api?
一般來說,服務端和客戶端要做一個接口的約定。
一般封裝的json數據代表意義:
{
"code":0 //0代表某種狀態
"msg":"success" //代表code對應的相應信息
"data":{}[] //可能是對象,也可能是一個數組
}
2. 頁面
不優雅代碼是什麼樣的?
當需要一個方法時,可能一個return語句就解決了
return new Result(0,"code","data");
如果方法很多呢,而且格式不一樣
return new Result(1,"code")
這叫硬編碼,維護不變,且閱讀不便,需要封裝
優雅代碼該怎麼寫?
新建Result結果的封裝類。
public class Result<T> {//注意:因爲返回的data不知道是什麼類型,那麼定義一個泛型。
private int code;
private String msg;
private T data; //可能是錯誤信息,可能是返回的頁面
//success
private Result(T data) {
this.code=0;
this.msg="success";
this.data=data;
}
//error
private Result(CodeMsg cm) {
if(cm==null) {
return;
}
this.code=cm.getCode();
this.msg=cm.getMsg();
}
//成功
public static <T> Result<T> success(T data){
return new Result<T>(data) ;
}
// 失敗
public static <T> Result<T> error(CodeMsg sm) {//CodeMsg包含了code和msg
return new Result<T>(sm);
}
public int getCode() {
return code;
}
public String getMsg() {
return msg;
}
public T getData() {
return data;
}
2.新建CodeMsg,對處理結果成功或者錯誤的情況做一個CodeMsg的封裝。
/**
* 成功的時候,只返回數據。
失敗的話,那麼就返回CodeMsg。(裏面包含錯誤碼以及錯誤信息)
*
*/
public class CodeMsg {
private int code;
private String msg;
//通用異常
public static CodeMsg SUCCESS=new CodeMsg(0,"success");
public static CodeMsg SERVER_ERROR=new CodeMsg(500100,"服務端異常!");
public static CodeMsg BIND_ERROR=new CodeMsg(500101,"參數校驗異常:%s");
public static CodeMsg REQUEST_ILLEAGAL=new CodeMsg(500102,"非法請求!");
public static CodeMsg MIAOSHA_FAIL=new CodeMsg(500103,"秒殺失敗!");
public static CodeMsg ACCESS_LIMIT=new CodeMsg(500104,"達到訪問限制次數,訪問太頻繁!");
//登錄模塊異常
public static CodeMsg SESSION_ERROR=new CodeMsg(500210,"session失效!");
public static CodeMsg PASSWORD_EMPTY=new CodeMsg(500211,"密碼不能爲空!");
public static CodeMsg MOBILE_EMPTY=new CodeMsg(500212,"手機號不能爲空!");
public static CodeMsg MOBILE_ERROR=new CodeMsg(500213,"手機號格式錯誤!");
public static CodeMsg MOBILE_NOTEXIST=new CodeMsg(500214,"手機號號碼不存在!");
public static CodeMsg PASSWORD_ERROR=new CodeMsg(500215,"密碼錯誤!");
//訂單模塊異常
public static CodeMsg ORDER_NOT_EXIST=new CodeMsg(500410,"訂單不存在!");
//秒殺模塊異常
public static CodeMsg MIAOSHA_OVER_ERROR=new CodeMsg(500500,"商品秒殺完畢,庫存不足!");
public static CodeMsg REPEATE_MIAOSHA=new CodeMsg(500500,"不能重複秒殺!");
public CodeMsg(int code,String msg) {
this.code=code;
this.msg=msg;
}
public int getCode() {
return code;
}
public String getMsg() {
return msg;
}
//返回一個帶參數的錯誤碼
public CodeMsg fillArgs(Object...args) {//變參
int code=this.code;
//message是填充了參數的message
String message=String.format(this.msg, args);
return new CodeMsg(code,message);
}
@Override
public String toString() {
return "CodeMsg [code=" + code + ", msg=" + msg + "]";
}
}
Controller裏面的代碼,使用了封裝類之後的返回效果更賞心悅目。注意:@ResponseBody註解,如果返回給前端json數據的時候,需要使用該註解!!!
@Controller
@RequestMapping("/demo")//注意!!!加了一個路徑
public class DemoController {
@RequestMapping("/")
@ResponseBody
public String home() {
return "hello world";
}
@RequestMapping("/hello")
@ResponseBody
public Result<String> hello() {
return Result.success("hello xxh");
}
@RequestMapping("/helloError")
@ResponseBody
public Result<String> helloError() {
return Result.error(CodeMsg.SERVER_ERROR);
}
}
注意: 記得刪除set方法,保留set方法,別人會通過此方法改變成員變量,且代碼多餘。
成功顯示:
總結:
對經常使用的代碼進行封裝,方便後面項目的開發與維護,同時代碼可讀性得到增強,代碼儘量不要硬編碼,思考是否可能造成的不便。