【问题标题】:MVC serialize json using Json.NETMVC 使用 Json.NET 序列化 json
【发布时间】:2013-01-02 21:22:16
【问题描述】:

我在控制器中有这段代码

[HttpPost]
public ActionResult Index([DataSourceRequest]DataSourceRequest request)
{
    var tickets = db.Tickets.Include(t => t.AreaOfBusiness).Include(t => t.Assignee).Include(t => t.Severity).Include(t => t.TicketStatu);
    return this.Json(tickets.ToDataSourceResult(request));
}

但我明白了

在序列化“System.Data.Entity.DynamicProxies.Ticket_2B104FE45830306408DA130C08090F61ADA6B8A0106592FECE85087B94B”类型的对象时检测到循环引用

在启动 KendoGrid 时。

我读到 NewtonSoft Json.Net 可以处理循环引用。我不明白如何使用它。

您能帮我修改代码以便使用 Json.Net 吗?

提前谢谢!

【问题讨论】:

  • 返回什么ToDataSourceResult
  • 我想要使用 NewtonSoft 的 Json.NET 的等效代码,这样我就不必在我的架构中删除主键和外键以避免“循环引用”
  • 你能把NewtonSoft Json.Net 看明白吗?
  • 我不知道!我想用 NewtonSoft 的工具替换这个 >this.Json(tickets.ToDataSourceResult(request)) 。我不知道怎么做,这就是我发布问题的原因:)

标签: asp.net-mvc json json.net


【解决方案1】:

ToDataSourceResult 返回对象DataSourceResult

剑道文档

序列化类型对象时检测到循环引用

这个错误的原因是Json方法使用的JavaScriptSerializer类不能序列化包含循环引用(互相引用)的对象图。最好的解决方案是使用 View Model 对象并避免序列化创建循环引用的属性。查看"How do I avoid circular reference exceptions" 常见问题部分了解更多信息。

see documentation

“如何避免循环引用异常?”

如果序列化对象包含循环引用,JavaScriptSerializer 类将抛出异常。为了避免这种情况,请使用视图模型并排除创建循环引用的属性

see example

More data

【讨论】:

  • 感谢您的回答和链接 Andrea,但我发现必须削弱一个非常健全的数据库架构才能使某个序列化程序正常工作,这很不妥。 Newtonsoft 可以处理循环引用,所以我更愿意给它一个机会而不是省略列和关系。
  • 再次感谢!我可能很无聊,但我不能接受由具有 PK 和 FK 的关系数据库模式生成的 EF 实体不能被 Json 编辑!我想要 KendoUIGrid 的 ajax 方法,我读到 Json 是必须的。出于测试目的,我留下了 5 个表,1 个“主”表和 4 个为第一个 FK 提供食物。你猜怎么了?我得到了同样的循环引用错误!我真的很失望:(
【解决方案2】:

或者...您可以启用 json.net 功能来序列化处理对象的循环引用

在你的 global.asax.cs

System.Net.Http.Formatting.JsonMediaTypeFormatter jsonMediaTypeFormatter = GlobalConfiguration.Configuration.Formatters.OfType<System.Net.Http.Formatting.JsonMediaTypeFormatter>().FirstOrDefault();
jsonMediaTypeFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Serialize;
jsonMediaTypeFormatter.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.Objects;

记得禁用延迟加载,否则它会下载整个数据库,在 dbsets 上使用 include 来保持你想要的关系 并解析现在表现得像字典一样的 json,例如:https://gist.github.com/keesey/7995398

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-17
    相关资源
    最近更新 更多