码迷,mamicode.com
首页 > Web开发 > 详细

解决MVC Json序列化的循环引用问题/EF Json序列化循引用问题---Newtonsoft.Json

时间:2019-04-12 21:57:39      阅读:191      评论:0      收藏:0      [点我收藏+]

标签:set   说明   override   .json   string   on()   obj   HERE   数据   

标签:

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

返回结果中,没有关联表数据

技术图片

 

解决MVC Json序列化的循环引用问题/EF Json序列化循引用问题---Newtonsoft.Json

标签:set   说明   override   .json   string   on()   obj   HERE   数据   

原文地址:https://www.cnblogs.com/mingjing/p/10698804.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!