使用 JsonConvert 将异常序列化为 Json 时排除 StackTrace

Exclude StackTrace when serializing Exception to Json using JsonConvert

我正在使用下面的代码将 'objects' 序列化为 Json:

    var settings = new JsonSerializerSettings
    {
        DefaultValueHandling = DefaultValueHandling.Ignore,
        NullValueHandling = NullValueHandling.Ignore,
    };
    var ObjectJson = JsonConvert.SerializeObject(obj, settings),

然而,当我使用相同的代码序列化一个 Exception 对象时,一些属性(如 StackTrace)也包括在内:

{
    "StackTrace":"   at SomeFile.cs:line xxx",
    "Message":"Message",
    "Data":{},
    "Source":"Source.Namespace",
    "HResult":-2146233088,
    "MyCustomExceptionProperty":"SomeValue"
}

是否有一些通用方法可以排除特定属性(对于特定 classes,如 Exception)序列化到 Json,而不必应用属性(如 [JsonIgnore]) 到原来的 class (like Exception), 所以我只能得到这个:

{
    "Message":"Message",
    "MyCustomExceptionProperty":"SomeValue"
}

最好有一个通用的解决方案,但我也很高兴它只适用于不需要的 Exception 属性。

您可以创建合同解析器 - 只需找出您想要的过滤条件即可:

class Resolver : DefaultContractResolver
{
    protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
    {
        if(typeof(Exception).IsAssignableFrom(type)) {
            IList<JsonProperty> props = base.CreateProperties(type, memberSerialization);
            return props.Where(p => ....... ).ToList();
        }
        return base.CreateProperties(type, memberSerialization);
    }
}

并像这样使用它:

    JsonSerializerSettings settings = new JsonSerializerSettings
    {
        ContractResolver = new Resolver()
    };

    string json = JsonConvert.SerializeObject(w, settings);