使用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
包括一个显式处理ExceptionConverterArgumentNullException
我需要序列化的所有地方,确保我的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/

10-09 09:08