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


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());
        }
    }
}
View Code

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
        };
    }
}
View Code

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
    //};
}
View Code

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

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

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

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

相關文章:

Newtonsoft.Json簡介:http://blog.csdn.net/u011127019/article/details/51706619

EF的Json序列化,循環引用:http://blog.csdn.net/u011127019/article/details/51706659

自引用:https://my.oschina.net/tianma3798/blog/673159


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM