1..Net開源Json序列化工具Newtonsoft.Json中提供瞭解決序列化的迴圈引用問題: 方式1:指定Json序列化配置為 ReferenceLoopHandling.Ignore 方式2:指定 JsonIgnore忽略 引用對象 實例1,解決MVC的Json序列化引用方法: step1: ...
1..Net開源Json序列化工具Newtonsoft.Json中提供瞭解決序列化的迴圈引用問題:
方式1:指定Json序列化配置為 ReferenceLoopHandling.Ignore
方式2:指定 JsonIgnore忽略 引用對象
實例1,解決MVC的Json序列化引用方法:
step1:在項目上添加引用 Newtonsoft.Json程式包,命令:Insert-Package Newtonsoft.Json
step2:在項目中添加一個類,繼承JsonResult,代碼如下:
/// <summary>
/// 繼承JsonResut,重寫序列化方式
/// </summary>
public class JsonNetResult : JsonResult
{
public JsonSerializerSettings Settings { get; private set; }
public JsonNetResult()
{
Settings = new JsonSerializerSettings
{
//這句是解決問題的關鍵,也就是json.net官方給出的解決配置選項.
ReferenceLoopHandling = ReferenceLoopHandling.Ignore
};
}
public override void ExecuteResult(ControllerContext context)
{
if (context == null)
throw new ArgumentNullException("context");
if (this.JsonRequestBehavior == JsonRequestBehavior.DenyGet && string.Equals(context.HttpContext.Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase))
throw new InvalidOperationException("JSON GET is not allowed");
HttpResponseBase response = context.HttpContext.Response;
response.ContentType = string.IsNullOrEmpty(this.ContentType) ? "application/json" : this.ContentType;
if (this.ContentEncoding != null)
response.ContentEncoding = this.ContentEncoding;
if (this.Data == null)
return;
var scriptSerializer = JsonSerializer.Create(this.Settings);
using (var sw = new StringWriter())
{
scriptSerializer.Serialize(sw, this.Data);
response.Write(sw.ToString());
}
}
}
step3:在項目添加BaseController,重寫Json()方法,代碼如下:
public class BaseController : Controller
{
public StudentContext _Context = new StudentContext();
/// <summary>
/// 重寫,Json方法,使之返回JsonNetResult類型
/// </summary>
protected override JsonResult Json(object data, string contentType,
Encoding contentEncoding, JsonRequestBehavior behavior)
{
return new JsonNetResult
{
Data = data,
ContentType = contentType,
ContentEncoding = contentEncoding,
JsonRequestBehavior = behavior
};
}
}
step4.向平時一樣使用就可以了
//獲取列表
public JsonResult GetList()
{
List<student> list = _Context.students.Where(q => q.sno == "103").ToList();
//方法1
return Json(list);
//方法2
//return new JsonNetResult() {
// Data=list
//};
}
獲取的結果,說明,這種方式指定忽略迴圈引用,是在指定迴圈級數後忽略,返回的json數據中還是有部分迴圈的數據
解決EF Json序列化迴圈引用方法2,在指定的關聯對象上,添加JsonIgnore 方法註釋
[JsonIgnore]
public virtual ICollection<score> scores { get; set; }
返回結果中,沒有關聯表數據
文章轉載自:http://www.cnblogs.com/tianma3798/p/5596703.html