将EF模型序列化为Json时的循环引用
我知道有很多关于这个主题的问题,但是没有一个问题解决了我的问题。
我正在使用MVC 5和Entity Framework 6以及Newtonsoft.Json。
我有这种例外的通常情况:
Service => Staff => Service
当我尝试在我的视图中序列化service
对象时,如下所示:
var arr = @Html.Raw(@JsonConvert.SerializeObject(Model.Services));
我得到“ circular reference was detected while serializing an object of type...
”exception。
我在这里找到的所有答案都说它很难解决,我应该补充一下
GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings .PreserveReferencesHandling = PreserveReferencesHandling.All; GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings .ReferenceLoopHandling = ReferenceLoopHandling.Serialize;
在我的Global.asax
文件中。
好吧,我做了,它只是不起作用。 我在MSDN上阅读了一堆文章,他们都说了同样的话。 我不知道为什么,但它对我不起作用。
我能使其工作的唯一方法是在我的控制器中创建整个序列化上下文:
var settings = new JsonSerializerSettings { PreserveReferencesHandling = PreserveReferencesHandling.All, ReferenceLoopHandling = ReferenceLoopHandling.Serialize }; var serializer = JsonSerializer.Create(settings); var msmStream = new MemoryStream(); var txtWriter = new StreamWriter(msmStream); var writer = new JsonTextWriter(txtWriter) { Formatting = Formatting.Indented }; serializer.Serialize(writer, services); var json = Encoding.ASCII.GetString(msmStream.GetBuffer());
但是,这是一个非常可怕的解决方案,特别是如果我在视图中动态地从我的视图模型中序列化一个属性。 它也打败了“全球配置”的整个目的。
有人遇到过这个问题吗?
您需要将DefaultSettings更改为新的。
JsonConvert.DefaultSettings = () => new JsonSerializerSettings { PreserveReferencesHandling = PreserveReferencesHandling.All, ReferenceLoopHandling = ReferenceLoopHandling.Serialize };
资源
默认的序列化程序设置需要更改如下。 在Global.aspx中,
protected void Application_Start() { var jsonMediaTypeFormatter = GlobalConfiguration.Configuration.Formatters.JsonFormatter; jsonMediaTypeFormatter.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.All; jsonMediaTypeFormatter.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore; }
GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings
仅影响Web API调用。 由于您直接调用JsonConvert.SerializeObject
,您需要将设置直接传递给它,如下所示,或者设置全局默认设置,如@ vendettamit的答案所示。
上述就是C#学习教程:将EF模型序列化为Json时的循环引用分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
var arr = @Html.Raw(@JsonConvert.SerializeObject(Model.Services, new JsonSerializerSettings { PreserveReferencesHandling = PreserveReferencesHandling.All }));
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/989782.html