解決MVC Json序列化的循環引用問題/EF Json序列化循引用問題---Newtonsoft.Json

標籤:json

1..Net開源Json序列化工具Newtonsoft.Json中提供瞭解決序列化的循環引用問題:app

方式1:指定Json序列化配置爲 ReferenceLoopHandling.Ignoreide

方式2:指定 JsonIgnore忽略 引用對象工具

實例1,解決MVC的Json序列化引用方法:oop

step1:在項目上添加引用 Newtonsoft.Json程序包,命令:Insert-Package Newtonsoft.Jsonthis

step2:在項目中添加一個類,繼承JsonResult,代碼以下:spa

 

 

技術分享
/// <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());
        }
    }
}
View Code

 

 

step3:在項目添加BaseController,重寫Json()方法,代碼以下:.net

技術分享
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
        };
    }
}
View Code

step4.向平時同樣使用就能夠了code

技術分享
//獲取列表
public JsonResult GetList()
{
    List<student> list = _Context.students.Where(q => q.sno == "103").ToList();
    //方法1
    return Json(list);
    //方法2
    //return new JsonNetResult() {
    //    Data=list
    //};
}
View Code

獲取的結果,說明,這種方式指定忽略循環引用,是在指定循環級數後忽略,返回的json數據中仍是有部分循環的數據對象

技術分享

解決EF Json序列化循環引用方法2,在指定的關聯對象上,添加JsonIgnore 方法註釋

[JsonIgnore]
public virtual ICollection<score> scores { get; set; }

返回結果中,沒有關聯表數據

技術分享

相關文章
相關標籤/搜索