一、介绍
后台数据是通过二个基于某种CLR 类型的对象来承载的,当客户端调用某个Action 方法并希望以JSON 的格式返回请求的数据时, ASP.NET MVC 中
System.Web.Mvc.J sonResult将CLR 对象转换成JSON 格式予以响应;
返回JsonResult类型,通过调用Json()方法返回Json格式数据到试图
二、源代码分析
public class JsonResult : ActionResult
{
public override void ExecuteResult(ControllerContext context);
public object Data { get; set; }
public Encoding ContentEncoding { get; set; }
public string ContentType { get; set; }
public JsonRequestBehavior JsonRequestBehavior { get; set; }
public int? MaxJsonLength { get; set; }
public int? RecursionLimit { get; set; }
}
public enum JsonRequestBehavior
{
/// <summary>
/// 支持HTTP-GET请求
/// </summary>
AllowGet,
/// <summary>
/// 不支持HTTP-GET请求
/// 默认类型
/// </summary>
DenyGet
}
Data属性:一个object 类型的属性,表示需要被转换成JSON 格式的数据对象;
ContentEncoding:表示为当前响应设置的编码方式;
ContentType:表示为当前响应设置的媒体类型(默认采用的媒体类型为"applicaion/json");
JsonRequestBehavior属性:开启对HTTP-GET 请求的支持,该属性是JsonRequestBehavior 枚举类型,
两个枚举项AllowGet 和DenyGet(默认值) 分别表示允许/拒绝支持对HTTP-GET 请求的响应。
(JsonResult 在默认的情况下不能作为对HTTP-GET 请求的响应,在这种情况下并会直接抛出一个InvalidOperationException异常,
通过它的 JsonRequestBehavior 属性开启对HTTP-GET 请求的支持);
MaxJsonLength:被反序列化和序列化生成的JSON 字符串的长度,默认值为2097152 (Ox200000 ,等同于4MB 的Unicode 字符串数据);
RecursionLimit:用于设置被序列化对象和反序列化生成对象结构的允许的层级数,默认值为100;
ExecuteResult()方法具体实现:
public override void ExecuteResult(ControllerContext context)
{
//确认是否用于响应HTTP-GET 请求
if (this.JsonRequestBehavior == JsonRequestBehavior.DenyGet && string.Compare(context.HttpContext.Request.HttpMethod,"GET",true) == 0)
{
throw new InvalidOperationException();
}
HttpResponseBase response = context.HttpContext.Response;
//设直媒体类型和编码方式
response.ContentType = string.IsNullOrEmpty(this.ContentType) ? "application/json" : this.ContentType;
if (this.ContentEncoding != null) { response.ContentEncoding = this.ContentEncoding; }
//创建JavaScriptSerializer 将数据对象序列化成JSON 字符串并写入当前HttpResponse
if (null == this.Data) return;
JavaScriptSerializer serializer = new JavaScriptSerializer()
{
MaxJsonLength = this.MaxJsonLength.HasValue ? this.MaxJsonLength.Value : 0x200000,
RecursionLimit = this.RecursionLimit.HasValue ? this.RecursionLimit.Value : 100
};
response.Write(serializer.Serialize(this.Data));
}
三. CLR 对象到JSON 格式字符串的序列化过程使用的对象:
CLR 对象到JSON 格式字符串的序列化过程通过序列化器System.Web.Script. Serialization.JavaScriptSerializer 来完成。 JavaScriptSerializer 的Serialize和Deserialize方法实现了CLR 对象的序列化和对JSON 字符串的反序列化。
public class JavaScriptSerializer
{
// 序列化方法
public string Serialize(object obj);
// 反序列化方法
public object Deserialize(string input,Type targetType);
//被反序列化和序列化生成的JSON 字符串的长度,默认值为2097152 (Ox200000 ,等同于4MB 的Unicode 字符串数据)
public int MaxJsonLength { get; set; }
//用于设置被序列化对象和反序列化生成对象结构的允许的层级数,默认值为100
public int RecursionLimit { get; set; }
}
四.抽象类Con仕oller定义了如下一系列的Json 方法用于根据指定的数据对象、编码方式以及JsonRequestl3ehavior 来创建相应的JsonResult:
public abstract class Controller : ControllerBase,IActionFilter,IAuthorizationFilter,IDisposable,..........
{
protected internal JsonResult Json(object data);
protected internal JsonResult Json(object data,JsonRequestBehavior behavior);
protected internal JsonResult Json(object data,string contentType);
protected internal virtual JsonResult Json(object data,string contentType,Encoding contentEncoding);
protected internal JsonResult Json(object data,JsonRequestBehavior behavior);
protected internal virtual JsonResult Json(object data,Encoding contentEncoding,JsonRequestBehavior behavior);
}
五.例子
[HttpPost]
public class AccountController : Controller
{
public JsonResult LoginGet( )
{
var result = new {
flag = "ok",
msg = "提供密码错误!"
};
return Json(result);
}
}
试图:
<script type="text/javascript">
$(function () {
$('#btLogin').click(function () {
//对象集合
// var models = [];
// models.push({ UserName: userName,Password: password });
//Json对象作为参数(名称必须与模型属性名相同)
var models = {
"UserName": userName,
"Password": password
};
//模型绑定
//var models = new Object();
//models.UserName = userName;
//models.Password = password;
$.ajax({
url: '/Account/Login',
data: JSON.stringify(models),
type: 'POST',
contentType: 'application/json; charset=utf-8',
success: function (data) {
if( data.flag =='ok') {
alert(data.msg);
} },error: function (XMLHttpRequest,textStatus,errorThrown) { $.show_warning('提示','错误'); } }); }); }); </script>
原文链接:https://www.f2er.com/json/289479.html