如何获得原始json字符串(传递给JsonConvert。DeserializeObject方法)从JsonSerializer。错误处理程序?
public MyModel ParseFromJsonString(string jsonString)
{
var jsonSerializerSettings = new JsonSerializerSettings()
{
jsonSerializerSettings.Error = OnError;
}
return JsonConvert.DeserializeObject<MyModel>(jsonString, jsonSerializerSettings);
}
...
private void OnError(object sender, ErrorEventArgs errorEventArgs)
{
//How to get this from current place ?
string originalJsonString;
//in log record I want to mention incoming json string that was processed by deserialization
logger.Error("error: {0}, happened at deserialisation json: {1}", errorEventArgs.ErrorContext.Error.Message, originalJsonString);
//allows to continues deserializing, ignoring error and prevents throwing exception
errorEventArgs.ErrorContext.Handled = true;
}
在errorreventargs中没有这样的属性,然后我认为它应该在"sender"中,这是JsonSerializer的实例,它包含许多属性,但我也没有找到。不明白,为什么这么酷的json.net包没有包含这个。String是一种引用类型,因此应该可以在errorreventargs中存储对相同字符串实例的引用,并且不会因为复制而消耗额外的内存(在大json的情况下可能会降低性能)
通过将错误处理程序转换为lambda,您可以在c#编译器的帮助下访问它。
public MyModel ParseFromJsonString(string jsonString)
{
var jsonSerializerSettings = new JsonSerializerSettings()
{
Error = (sender, errorEventArgs) =>
{
//You can use your "jsonString" here
}
};
return JsonConvert.DeserializeObject<MyModel>(jsonString, jsonSerializerSettings);
}
PS:它是如何工作的?c#闭包讲解,c#中的闭包
我已经看过ErrorEventArgs
,类中没有原始字符串的属性。然而,你可以做一些类似于EZI的答案。
将OnError
方法的方法签名更改为如下内容:
private void OnJsonError(object sender, ErrorEventArgs errorEventArgs, string jsonString)
然后在JsonSerializerSettings
结构中执行以下操作:
var jsonSerializerSettings = new JsonSerializerSettings()
{
Error = (sender, errorEventArgs) => { OnJsonError(sender,errorEventArgs,jsonString); }
};
这样,您就可以保持OnJsonError
方法的可重用性,同时在原始工作中添加最少的代码行。