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

JsonConvert.SerializeObject 

我得到了以下错误:

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

我怎么解决这个问题?


当前回答

使用JsonSerializerSettings

ReferenceLoopHandling。如果遇到引用循环,Error(默认)将出错。这就是为什么会出现异常。 ReferenceLoopHandling。如果对象嵌套但不是无限的,序列化是有用的。 ReferenceLoopHandling。如果对象是自身的子对象,Ignore将不会序列化该对象。

例子:

JsonConvert.SerializeObject(YourPOCOHere, Formatting.Indented, 
new JsonSerializerSettings 
{ 
        ReferenceLoopHandling = ReferenceLoopHandling.Serialize
});

如果你必须序列化一个无限嵌套的对象,你可以使用PreserveObjectReferences来避免StackOverflowException。

例子:

JsonConvert.SerializeObject(YourPOCOHere, Formatting.Indented, 
new JsonSerializerSettings 
{ 
        PreserveReferencesHandling = PreserveReferencesHandling.Objects
});

选择对要序列化的对象有意义的内容。

参考http://james.newtonking.com/json/help/

其他回答

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

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

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

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

简单地放置Configuration。ProxyCreationEnabled = false;在上下文文件中;这样问题就解决了。

public demEntities()
    : base("name=demEntities")
{
    Configuration.ProxyCreationEnabled = false;
}

c#代码:

            var jsonSerializerSettings = new JsonSerializerSettings
            {
                ReferenceLoopHandling = ReferenceLoopHandling.Serialize,
                PreserveReferencesHandling = PreserveReferencesHandling.Objects,
            };

            var jsonString = JsonConvert.SerializeObject(object2Serialize, jsonSerializerSettings);

            var filePath = @"E:\json.json";

            File.WriteAllText(filePath, jsonString);

请确保在您的方法中使用await和async。如果对象没有正确序列化,就会出现此错误。

使用JsonSerializerSettings

ReferenceLoopHandling。如果遇到引用循环,Error(默认)将出错。这就是为什么会出现异常。 ReferenceLoopHandling。如果对象嵌套但不是无限的,序列化是有用的。 ReferenceLoopHandling。如果对象是自身的子对象,Ignore将不会序列化该对象。

例子:

JsonConvert.SerializeObject(YourPOCOHere, Formatting.Indented, 
new JsonSerializerSettings 
{ 
        ReferenceLoopHandling = ReferenceLoopHandling.Serialize
});

如果你必须序列化一个无限嵌套的对象,你可以使用PreserveObjectReferences来避免StackOverflowException。

例子:

JsonConvert.SerializeObject(YourPOCOHere, Formatting.Indented, 
new JsonSerializerSettings 
{ 
        PreserveReferencesHandling = PreserveReferencesHandling.Objects
});

选择对要序列化的对象有意义的内容。

参考http://james.newtonking.com/json/help/