是否可以配置Newtonsoft.Json以忽略具有[ScriptIgnore]属性的属性

时间:2018-11-14 17:37:35

标签: json.net

我有一个第三方类(我们称其为Class1),我需要将其序列化为JSON。如果我尝试按原样进行操作,则会收到StackOverflowExceptionJsonSerializationException并显示消息“ 检测到类型为的自引用循环”。我已尝试为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]完成此配置吗?

任何想法,我将不胜感激。

1 个答案:

答案 0 :(得分:2)

没有为此的配置选项。如果您search on githubScriptIgnoreAttribute甚至都不会出现在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);

您可能想cache the contract resolver for best performance