内容简介:今天幫同事找問題時碰到 Mvc 序列化 Json 的地雷,問題出在程式碼:回傳:
今天幫同事找問題時碰到 Mvc 序列化 Json 的地雷,問題出在 Controller.Json() 是使用 JavaScriptSerializer 序列化物件成 Json 字串,日期經轉換後無法讓前端 JavaScript 直接套用 new Date() 。
原 Json 方法
程式碼:
public ActionResult Test()
{
var data = new
{
Id = 1,
Name = Guid.NewGuid().ToString(),
Now = DateTime.Now
};
return Json(data, JsonRequestBehavior.AllowGet);
}
回傳:
{
"Id": 1,
"Name": "450dd1c9-034c-490e-aa05-8e5a2983c5fb",
"Now": "/Date(1545478289178)/"
}
首先使用預設的 Controller.Json() 來測試一次的結果如上,微軟預設的 JavaScriptSerializer 將日期轉換成 /Date(1545478289178)/ ,如果直接將轉換結果塞到 new Date() 會噴錯誤訊息。
複寫 Json 方法
程式碼:
public class JsonNetResult : JsonResult
{
public JsonSerializerSettings SerializerSettings { get; set; }
public Formatting Formatting { get; set; }
public JsonNetResult()
{
SerializerSettings = new JsonSerializerSettings();
}
public override void ExecuteResult(ControllerContext context)
{
if (context == null)
{
throw new ArgumentNullException("context");
}
HttpResponseBase response = context.HttpContext.Response;
response.ContentType = !string.IsNullOrWhiteSpace(ContentType) ? ContentType : "application/json";
if (ContentEncoding != null)
{
response.ContentEncoding = ContentEncoding;
}
if (Data != null)
{
using (var writer = new JsonTextWriter(response.Output) { Formatting = Formatting })
{
JsonSerializer serializer = JsonSerializer.Create(SerializerSettings);
serializer.Serialize(writer, Data);
writer.Flush();
}
}
}
}
protected override JsonResult Json(object data, string contentType, Encoding contentEncoding, JsonRequestBehavior behavior)
{
// 模擬原本阻擋 GET 的機制
if (behavior == JsonRequestBehavior.DenyGet &&
string.Equals(this.Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase))
{
return new JsonResult();
}
return new JsonNetResult()
{
Data = data,
ContentType = contentType,
ContentEncoding = contentEncoding
};
}
回傳:
{
"Id": 1,
"Name": "e42ba764-0497-494a-99b2-90c035ddf169",
"Now": "2018-12-22T19:46:31.9098858+08:00"
}
上面的程式碼 override 掉原本 Controller.Json() 並採用 Json.NET 這個高效能的 Json 序列化套件,它將日期格式依照 ISO 8601 標準轉換成 2018-12-22T19:46:31.9098858+08:00 ,效能也比原本的 JavaScriptSerializer 來的高( 測試數據 ),接著丟到 new Date() 試試果然成功。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 在 Angular 使用 HttpClient 的各種 TypeScript 地雷與陷阱
- Java 序列化反序列化对比
- python 序列化和反序列化
- json序列化和反序列化
- golang gencode 序列化/反序列化数据
- python的序列化和反序列化
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
计算机程序的构造和解释
Harold Abelson、Gerald Jay Sussman、Julie Sussman / 裘宗燕 / 机械工业出版社 / 2004-2 / 45.00元
《计算机程序的构造和解释(原书第2版)》1984年出版,成型于美国麻省理工学院(MIT)多年使用的一本教材,1996年修订为第2版。在过去的二十多年里,《计算机程序的构造和解释(原书第2版)》对于计算机科学的教育计划产生了深刻的影响。第2版中大部分重要程序设计系统都重新修改并做过测试,包括各种解释器和编译器。作者根据其后十余年的教学实践,还对其他许多细节做了相应的修改。 海报:一起来看看 《计算机程序的构造和解释》 这本书的介绍吧!