DateTime型別資料格式問題
問題
在使用ASP.NET MVC 在寫專案的時候發現,回傳給前端的JSON資料,日期型別是 Date(121454578784541) 的格式,需要前端來轉換一下才能用來使用,
C#物件屬性名稱轉換成JSON自動轉成“駝峰命名法”
問題
在C#中推薦的屬性命名方式是“帕斯卡命名法”【首字母大寫】但是在前端推薦命名方式為“駝峰命名法”【首字母小寫】,這樣如果直接序列化C#物件,回傳的屬性就是大寫的了
MVC 默認的回傳JsonResult在序列化有回圈參考物件時候會出現例外
問題
序列化型別為“XXXXXX.XXXX.XXX”的物件時檢測到回圈參考,
解決辦法
創建新的 JsonResult 物件
使用新的JSON序列化組件 Newtonsoft.Json
Install-Package Newtonsoft.Json
創建新的 JsonResult 物件
然后在新的 JsonResult 型別中將處理JSON序列化的物件改為 Newtonsoft.Json
并設定JSON轉換的日期格式為 yyyy-MM-dd HH:mm:ss 例如:【2020-03-28 17:36:23】
并設定 轉換的屬性為“駝峰命名法”
/// <summary> /// JSON結果回傳物件 /// </summary> public class JsonNetResult : JsonResult { /// <summary> /// 實體化JSON結果回傳物件 /// </summary> /// <param name="data">需要序列化的物件</param> /// <returns>JSON結果物件</returns> public JsonNetResult(object data) : this(data, JsonRequestBehavior.DenyGet) { } /// <summary> /// 實體化JSON結果回傳物件 /// </summary> /// <param name="data">需要序列化的物件</param> /// <param name="jsonRequestBehavior">設定是否允許GET請求獲取JSON結果物件</param> /// <returns>JSON結果物件</returns> public JsonNetResult(object data, JsonRequestBehavior jsonRequestBehavior) { this.Data =https://www.cnblogs.com/liuzhenliang/p/ data; this.JsonRequestBehavior = jsonRequestBehavior; this.Settings = new JsonSerializerSettings { ReferenceLoopHandling = ReferenceLoopHandling.Ignore, //忽略回圈參考 DateFormatString = "yyyy-MM-dd HH:mm:ss", //輸出的日期格式 ContractResolver = new CamelCasePropertyNamesContractResolver() //設定屬性的名稱為“駝峰命名法” }; } /// <summary> /// JSON序列化設定物件 /// </summary> public JsonSerializerSettings Settings { get; set; } /// <summary> /// 向回應流回傳結果方法 /// </summary> public override void ExecuteResult(ControllerContext context) { //判斷當前請求是否為GET且判斷是否允許GET獲取JSON,不允許就報錯 if ("GET".Equals(context.HttpContext.Request.HttpMethod, StringComparison.OrdinalIgnoreCase) && this.JsonRequestBehavior == JsonRequestBehavior.DenyGet) throw new Exception("不允許GET請求回傳JSON資料!"); //判斷是否改變回應資料編碼 if (this.ContentEncoding != null) context.HttpContext.Response.ContentEncoding = this.ContentEncoding; //如果當前需要序列化的資料為NULL就直接回傳 if (this.Data =https://www.cnblogs.com/liuzhenliang/p/= null) return; //設定回應資料內容格式為 json context.HttpContext.Response.ContentType = string.IsNullOrEmpty(this.ContentType) ? "application/json" : this.ContentType; //向回應流寫入序列化的資料 JsonSerializer.Create(Settings).Serialize(context.HttpContext.Response.Output, this.Data); } }
使用新的 JsonResult 物件 方法一(推薦)
使用過濾器,將JsonResult物件替換成 JsonNetResult 物件
創建一個ActionFilter,用來將回傳的JsonResult物件轉換成新的JsonNetResult物件
/// <summary> /// 將Action回傳的JsonResult轉換成JsonNetAction /// </summary> public class JsonNetActionFilter : IActionFilter { public void OnActionExecuting(ActionExecutingContext filterContext) { } public void OnActionExecuted(ActionExecutedContext filterContext) { //判斷是JsonResult物件 if (filterContext.Result is JsonResult && !(filterContext.Result is JsonNetResult)) { //得到原JsonResult物件 var jsonResult = (JsonResult) filterContext.Result; //創建新的JsonNetResult物件 var jsonNetResult = new JsonNetResult(jsonResult.Data) { ContentEncoding = jsonResult.ContentEncoding, ContentType = jsonResult.ContentType, JsonRequestBehavior = jsonResult.JsonRequestBehavior, MaxJsonLength = jsonResult.MaxJsonLength, RecursionLimit = jsonResult.RecursionLimit }; //將新的JsonNetResult物件賦值給回傳結果 filterContext.Result = jsonNetResult; } } }
在Global.asax注冊過濾器
public class MvcApplication : HttpApplication { protected void Application_Start() { AreaRegistration.RegisterAllAreas(); RouteConfig.RegisterRoutes(RouteTable.Routes); //注冊過濾器 GlobalFilters.Filters.Add(new JsonNetActionFilter()); } }
使用
public class HomeController : Controller { public ActionResult GetStudent() { var student = new StudentDto { Id = 1, Name = "張三", Age = 18, ClassName = "B36", CreateDate = DateTime.Now, }; return Json(student); } }
回傳給前端的JSON資料
{"id":1,"name":"張三","age":18,"className":"B36","createDate":"2020-03-28 17:47:29"}
使用新的 JsonResult 物件 方法二
創建一個BaseController 來重寫他的Json()方法
創建一個 BaseController 類 繼承自 Controller 類
并重寫他的 Json() 方法,其他Controller 類都繼承自 BaseController
這樣 可以直接沿用之前的 回傳Json物件方法
/// <summary> /// 父 控制器 /// </summary> public class BaseController : Controller { /// <summary> /// 回傳 JsonNetResult 物件 /// </summary> /// <param name="data">需要回傳序列化的物件</param> /// <param name="contentType">內容格式</param> /// <param name="contentEncoding">內容編碼</param> /// <param name="behavior">指定是否允許來自客戶端的 HTTP GET 請求,</param> /// <returns>JsonResult物件</returns> protected override JsonResult Json(object data, string contentType, Encoding contentEncoding, JsonRequestBehavior behavior) { return new JsonNetResult(data) { ContentType = contentType, ContentEncoding = contentEncoding, JsonRequestBehavior = behavior }; } }
使用
public class HomeController : BaseController { public ActionResult GetStudent() { var student = new StudentDto { Id = 1, Name = "張三", Age = 18, ClassName = "B36", CreateDate = DateTime.Now, }; //將當前物件序列化成JSON回傳給前端 return Json(student); } }
回傳給前端的JSON資料
{"id":1,"name":"張三","age":18,"className":"B36","createDate":"2020-03-28 17:47:29"}
使用新的 JsonResult 物件 方法三
創建一個JSON幫助類
/// <summary> /// JSON幫助類 /// </summary> public static class JsonHelper { /// <summary> /// 將一個物件序列化成JSON格式字串回傳給請求方 /// </summary> /// <param name="obj">需要序列化的物件</param> /// <param name="jsonRequestBehavior">設定是否允許GET請求獲取JSON結果物件</param> /// <returns>JSON結果物件</returns> public static JsonNetResult Json(object obj, JsonRequestBehavior jsonRequestBehavior = JsonRequestBehavior.DenyGet) { return new JsonNetResult(obj, jsonRequestBehavior); } /// <summary> /// 將當前物件序列化成JSON格式字串回傳給請求方 /// </summary> /// <param name="obj">需要序列化的物件</param> /// <param name="jsonRequestBehavior">設定是否允許GET請求獲取JSON結果物件</param> /// <returns>JSON結果物件</returns> public static JsonNetResult ToJsonResult(this object obj, JsonRequestBehavior jsonRequestBehavior = JsonRequestBehavior.DenyGet) { return new JsonNetResult(obj, jsonRequestBehavior); } }
使用
public ActionResult GetStudent() { var student = new StudentDto { Name = "張三", Age = 18, ClassName = "B36", CreateDate = DateTime.Now, }; //直接呼叫擴展方法 ToJsonResult 來獲取新的 JsonResult return student.ToJsonResult(); }
回傳給前端的JSON資料
{"id":1,"name":"張三","age":18,"className":"B36","createDate":"2020-03-28 17:47:29"}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/1671.html
標籤:ASP.NET MVC
上一篇:EF修改部分欄位
