我有一个第三方类(我们称其为Class1
),我需要将其序列化为JSON。如果我尝试按原样进行操作,则会收到StackOverflowException
或JsonSerializationException
并显示消息“ 检测到类型为的自引用循环”。我已尝试为JsonConvert
应用以下设置,但并不能避免避免使用StackOverflowException
var settings = new JsonSerializerSettings
{
TypeNameHandling = TypeNameHandling.None,
PreserveReferencesHandling = PreserveReferencesHandling.None,
ReferenceLoopHandling = ReferenceLoopHandling.Ignore
};
反编译Class1
后,我发现Class1
的许多属性都标有[ScriptIgnore]
属性,该属性是[JsonIgnore]
的类似物,被{ {1}},但我需要使用Newtonsoft序列化程序。
就System.Web.Script.Serialization.JavaScriptSerializer
是第三方类而言,我无法将Class1
属性添加到所需的属性中。
我知道我可以开发自己的[JsonIgnore]
的实现,并在那里处理有问题的属性,但是我想避免使用此选项。
也许可以通过某种方式配置Newtonsoft序列化程序以同时考虑IContractResolver
属性和[ScriptIgnore]
属性。并使用[JsonIgnore]
完成此配置吗?
任何想法,我将不胜感激。
答案 0 :(得分:2)
没有为此的配置选项。如果您search on github,ScriptIgnoreAttribute
甚至都不会出现在Json.NET源树中。
即使您不想实现自己的IContractResolver
,这也将是简单易行的解决方案。首先,如下定义DefaultContractResolver
的以下子类:
public class ScriptIgnoreContractResolver : DefaultContractResolver
{
protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
{
var property = base.CreateProperty(member, memberSerialization);
if (!property.Ignored)
{
if (property.AttributeProvider.GetAttributes(true).Any(p => p.GetType().FullName == "System.Web.Script.Serialization.ScriptIgnoreAttribute"))
{
property.Ignored = true;
}
}
return property;
}
}
然后序列化如下:
// Define a static member
static readonly IContractResolver myResolver = new ScriptIgnoreContractResolver();
// And use it in your serialization method
var settings = new JsonSerializerSettings
{
ContractResolver = myResolver,
};
var json = JsonConvert.SerializeObject(rootObject, settings);