使用JSON.NET将System.ArgumentNullException
序列化为JSON时,部分消息似乎丢失:
var json = JsonConvert.SerializeObject(new ArgumentNullException("argument", "Some Message"));
返回:
{
"ClassName":"System.ArgumentNullException",
"Message":"Some Message",
"Data":null,
"InnerException":null,
"HelpURL":null,
"StackTraceString":null,
"RemoteStackTraceString":null,
"RemoteStackIndex":0,
"ExceptionMethod":null,
"HResult":-2147467261,
"Source":null,
"WatsonBuckets":null
}
我希望Message令牌为:
"Some Message\r\nParameter name: argument"
正如codefuller所指出的那样,
ArgumentNullException
实现了ISerializable
并且是罪魁祸首。我可以使用自定义JsonSerializerSettings
禁用此功能。但是,应用程序需要序列化任何对象,包括具有
ArgumentNullException
属性的对象。我宁愿避免忽略ISerialiable
,除非它出现问题。我的两个解决方案都包含一个自定义
JsonConverter
。解决方案1:集中式JsonSerializer
创建
JsonConverters
的静态列表以添加到JsonSerializer.Converters
包括一个显式处理
ExceptionConverter
的ArgumentNullException
我需要序列化的所有地方,确保我的
JsonSerializer
包括这些转换器缺点:其他开发人员必须严格确保他们将这些转换器及其序列化包括在内。
解决方案2:重写ArgumentNullException
我可以创建一个
CustomArgumentNullException
类,并使用JsonConvert
属性对其进行标记,以利用我的自定义转换器。缺点:其他开发人员必须严格确保他们提出了
CustomArgumentNullException
而不是ArgumentNullExcpetion
。希望的解决方案
我很乐意用指向我的自定义转换器的
ArgumentNullException
属性标记现有的JsonConverter
。在Json.NET代码库中有什么方法可以实现此目的? 最佳答案
异常类实现ISerializable
接口。默认情况下,此类对象Json.Net使用ISerializable.GetObjectData()
方法进行数据序列化。换句话说,ArgumentNullException
类自己控制如何序列化其数据。在其内部的某个地方,有一个逻辑可以仅对传递给构造函数的实际消息进行序列化,而无需Parameter name: argument
部分。
您可以更改此Json.Net行为,并避免将GetObjectData()
与以下JsonSerializerSettings
结合使用:
var settings = new JsonSerializerSettings()
{
ContractResolver = new DefaultContractResolver()
{
IgnoreSerializableInterface = true,
},
ReferenceLoopHandling = ReferenceLoopHandling.Ignore
};
var json = JsonConvert.SerializeObject(new ArgumentNullException("argument", "Some Message"), settings);
但是,在这种情况下,序列化字段集将与原始json不同。检查它是否真正满足您的需求。
关于c# - 将ArgumentNullException序列化为Json,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47564455/