我尝试序列化从实体数据模型.edmx自动生成的POCO类,当我使用

JsonConvert.SerializeObject 

我得到了以下错误:

为System.data.entity类型检测到自我引用循环错误。

我怎么解决这个问题?


当前回答

在。net 5中。使用下面的代码更新startup.cs中的ConfigureServices方法

public void ConfigureServices(IServiceCollection services)
{
    ----------------
    ----------------
    services.AddMvc().AddJsonOptions(options =>
    {
        options.JsonSerializerOptions.ReferenceHandler = ReferenceHandler.Preserve;
    });
    ------------------
}

默认情况下,序列化(System.Text.Json.Serialization)不支持带周期的对象,也不保留重复引用。使用Preserve可以在序列化时保存唯一的对象引用,并在反序列化时使用元数据读取保存的引用。 MSDN链接

其他回答

在WebApiConfig.cs类中使用:

var json = config.Formatters.JsonFormatter;
json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.Objects;
config.Formatters.Remove(config.Formatters.XmlFormatter);

人们已经讨论过将[JsonIgnore]添加到类中的虚拟属性,例如:

[JsonIgnore]
public virtual Project Project { get; set; }

我还将分享另一个选项,[JsonProperty(NullValueHandling = NullValueHandling. ignore)],仅当它为空时才从序列化中省略该属性:

[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
public virtual Project Project { get; set; }

在。net 5中。使用下面的代码更新startup.cs中的ConfigureServices方法

public void ConfigureServices(IServiceCollection services)
{
    ----------------
    ----------------
    services.AddMvc().AddJsonOptions(options =>
    {
        options.JsonSerializerOptions.ReferenceHandler = ReferenceHandler.Preserve;
    });
    ------------------
}

默认情况下,序列化(System.Text.Json.Serialization)不支持带周期的对象,也不保留重复引用。使用Preserve可以在序列化时保存唯一的对象引用,并在反序列化时使用元数据读取保存的引用。 MSDN链接

我喜欢从Application_Start()做它的解决方案,在这里的答案

显然,我不能在JavaScript中使用我的函数中的配置访问json对象,因为在DalSoft的答案中返回的对象在对象的(键,val)上都有“\n \r”。

不管怎样,只要能工作就好(因为不同的方法在不同的场景下工作,这取决于所提出的意见和问题),尽管最好采用一种标准的方法,并提供一些良好的文档支持该方法。

非常类似于这里的其他设置,通过使用序列化器设置解决。然而,我的起源,因为我使用FromObject方面的东西,因为我需要一个JObject来工作。

这意味着只需要创建默认序列化器并对其应用设置。简单的修复就变成了这样

 var deserializerSettings = new JsonSerializerSettings()
        {
            ReferenceLoopHandling = ReferenceLoopHandling.Serialize,
            PreserveReferencesHandling = PreserveReferencesHandling.Objects,
        };

        var serializer = JsonSerializer.CreateDefault(deserializerSettings);
            
        JObject jsonObject = (JObject)JToken.FromObject(mySelfRefernceObject, serializer);