秒殺系統 json封裝

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方法,別人會通過此方法改變成員變量,且代碼多餘。

成功顯示:

在這裏插入圖片描述

在這裏插入圖片描述

總結:

對經常使用的代碼進行封裝,方便後面項目的開發與維護,同時代碼可讀性得到增強,代碼儘量不要硬編碼,思考是否可能造成的不便。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章