使用 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);
我正在使用下面的代码将 '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);