处理json反序列化错误



如何获得原始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方法的可重用性,同时在原始工作中添加最少的代码行。

相关内容

  • 没有找到相关文章

最新更新