当前位置: 首页 > 编程语言 > C#

json.net;序列化实体框架对象(循环引用错误)分享

时间:2023-04-11 02:48:20 C#

json.net;序列化实体框架对象(循环引用错误)我有一个实体框架实体,我想将它序列化为一个json对象。我环顾四周,发现json.net(http://james.newtonking.com/projects/json-net.aspx)应该能够“开箱即用”地序列化带有循环引用的对象。所以我尝试使用stringjson=JsonConvert.SerializeObject(/*myefentity*/);但我仍然遇到同样的错误。问题可能是我需要使用ReferenceLoopHandling.Ignore和ContractResolver,但我不知道如何使用它们。非常感谢任何帮助!谢谢我的解决方案是简单地删除子实体上的父引用。所以在我的模型中,我选择了关系并将父引用更改为内部而不是公共。可能不是每个人的理想解决方案,但它对我有用。为了解决这个问题,我将我的实体转换为基于POCO的CodeFirst。为此,请右键单击edmx窗口并选择:添加代码生成项>代码选项卡>EFPOCO实体生成器。请注意,如果您没有看到它,您可能需要使用nuget安装它。但在运行时,EF会为这些对象添加代理类以进行跟踪,但它们往往会打乱序列化过程。为了防止这种情况,我们可以简单地将ProxyCreationEnabled设置为false,如下所示:varcontext=newYourEntities();context.Configuration.ProxyCreationEnabled=false;varresults=context.YourEntity.Take(100).ToList();然后,您可以通过省略默认引用循环来安全地返回JSON.NET序列化数据,如下所示:另一种解决方案是将[JsonIgnore]属性添加到导航属性。例如:使用系统;使用System.ComponentModel.DataAnnotations.Schema;[可序列化]publicclassEntity{publicintEntityID{get;放;}publicstringEntityName{get;放;}[JsonIgnore]publicvirtualParentParent{get;放;}[JsonIgnore]publicvirtualListChildren{get;放;我使用以下解决方案克隆我的实体,不需要关于实体数据属性的技巧,并且我的表循环引用被保留。我什至有实体相互指向对方,没有任何问题。序列化所需的库是Json.Net(Newtonsoft.Jsondll)。privatestaticTCloneObject(Tobj){if(obj==null)returnobj;字符串ser=JsonConvert.SerializeObject(obj,Formatting.Indented,newJsonSerializerSettings(){NullValueHandling=NullValueHandling.Ignore,MissingMemberHandling=MissingMemberHandling,ReLoop=ReferenceLoopHandling.Ignore});返回(T)JsonConvert.DeserializeObject(ser,obj.GetType());}使用示例:protectedobjectCopyObj(Objectobj){returnCloneObject(obj);}varcust1=this.cts。Customers().Where(cc=>cc.Id==3).Include(cc=>cc.Addresses).FirstOrDefault();varcust2=CopyObj(cust1)作为客户;//Cust2现在包含客户记录的副本及其地址试试这个:首先确保poco或模型有DataContract,DataMemeber并删除虚拟关键字..然后..以上都是C#学习教程分享:json.net;序列化实体框架对象(循环引用错误)内容,如果对你有用,需要了解更多C#学习教程,希望大家多多关注—publicstringGet(){varlist=_languageRepository.GetMany(l=>l.LanguageTrans.FirstOrDefault().CultureCode=="en").To列表();字符串json=JsonConvert.SerializeObject(列表,Formatting.Indented,newJsonSerializerSettings{PreserveReferencesHandling=PreserveReferencesHandling.Objects});返回json;}本文收集自网络,不代表立场。如涉及侵权请点击维权联系管理员删除转载请注明出处: