我的网站有4个表格的mssql数据库。
当我使用它时:
public static string GetAllEventsForJSON()
{
using (CyberDBDataContext db = new CyberDBDataContext())
{
return JsonConvert.SerializeObject((from a in db.Events where a.Active select a).ToList(), new JavaScriptDateTimeConverter());
}
}
代码导致以下错误:
Newtonsoft.Json.JsonSerializationException:为类型为“DAL.CyberUser”的属性“CyberUser”检测到自引用循环。 路径'[0] .EventRegistrations [0] .CyberUser.UserLogs [0]'。
答案 0 :(得分:160)
我对父/子集合遇到了同样的问题,发现那个帖子解决了我的情况。 我只想显示父集合项列表,并且不需要任何子数据,因此我使用了以下内容并且工作正常:
JsonConvert.SerializeObject(ResultGroups, Formatting.None,
new JsonSerializerSettings()
{
ReferenceLoopHandling = ReferenceLoopHandling.Ignore
});
JSON.NET Error Self referencing loop detected for type
它还引用了Json.NET codeplex页面:
答案 1 :(得分:39)
修复是忽略循环引用而不是序列化它们。此行为在JsonSerializerSettings
。
单JsonConvert
:
JsonConvert.SerializeObject((from a in db.Events where a.Active select a).ToList(), Formatting.Indented,
new JsonSerializerSettings() {
ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore
}
);
如果您想将此作为默认行为,请添加
全局设置,Global.asax.cs中的代码位于Application_Start()
:
JsonConvert.DefaultSettings = () => new JsonSerializerSettings {
Formatting = Newtonsoft.Json.Formatting.Indented,
ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore
};
答案 2 :(得分:25)
如果使用ASP.NET Core MVC,请将其添加到startup.cs文件的ConfigureServices方法中:
services.AddMvc()
.AddJsonOptions(
options => options.SerializerSettings.ReferenceLoopHandling =
Newtonsoft.Json.ReferenceLoopHandling.Ignore
);
答案 3 :(得分:13)
这可能会对你有帮助。
public MyContext() : base("name=MyContext")
{
Database.SetInitializer(new MyContextDataInitializer());
this.Configuration.LazyLoadingEnabled = false;
this.Configuration.ProxyCreationEnabled = false;
}
http://code.msdn.microsoft.com/Loop-Reference-handling-in-caaffaf7
答案 4 :(得分:5)
您必须设置保留对象引用:
var jsonSerializerSettings = new JsonSerializerSettings
{
PreserveReferencesHandling = PreserveReferencesHandling.Objects
};
然后将您的查询var q = (from a in db.Events where a.Active select a).ToList();
称为
string jsonStr = Newtonsoft.Json.JsonConvert.SerializeObject(q, jsonSerializerSettings);
请参阅: https://www.newtonsoft.com/json/help/html/PreserveObjectReferences.htm
答案 5 :(得分:5)
我正在使用Dot.Net Core 3.1并进行了搜索
“ Newtonsoft.Json.JsonSerializationException:为属性检测到自引用循环”
我正在将此问题添加到该问题中,因为这将很容易参考。 您应该在Startup.cs文件中使用以下内容:
services.AddControllers()
.AddNewtonsoftJson(options =>
{
// Use the default property (Pascal) casing
options.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
});
答案 6 :(得分:2)
对于asp.net核心3.1.3,这对我有用
q
答案 7 :(得分:1)
有时候,由于类型类具有对其他类的引用,而类又具有对类型类的引用,因此存在循环,因此您必须在json字符串中准确选择所需的参数,例如此代码。
List<ROficina> oficinas = new List<ROficina>();
oficinas = /*list content*/;
var x = JsonConvert.SerializeObject(oficinas.Select(o => new
{
o.IdOficina,
o.Nombre
}));
答案 8 :(得分:0)
match_parent
答案 9 :(得分:0)
在模型类中添加“ [JsonIgnore]”
{
public Customer()
{
Orders = new Collection<Order>();
}
public int Id { get; set; }
public string Name { get; set; }
public string Surname { get; set; }
[JsonIgnore]
public ICollection<Order> Orders { get; set; }
}
答案 10 :(得分:0)
可以将JsonSerializer实例配置为忽略引用循环。类似于以下内容,此函数允许保存带有json序列化对象内容的文件:
public static void SaveJson<T>(this T obj, string FileName)
{
JsonSerializer serializer = new JsonSerializer();
serializer.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
using (StreamWriter sw = new StreamWriter(FileName))
{
using (JsonWriter writer = new JsonTextWriter(sw))
{
writer.Formatting = Formatting.Indented;
serializer.Serialize(writer, obj);
}
}
}