繁体   English   中英

JSON反序列化的处理错误

[英]Handling error of json deserialisation

如何从JsonSerializer.Error处理程序获取原始json字符串(传递给JsonConvert.DeserializeObject方法)?

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;
 }

errorEventArgs中没有这样的属性,因此我认为它应该在JsonSerializer的实例“ sender”中,它包含许多属性,但是我也没有找到。 不明白,为什么像json.net这样酷的软件包没有包含这个。 字符串是引用类型,因此应该可以将对同一字符串实例的引用存储在errorEventArgs中,并且不会因为复制而消耗额外的内存(在使用大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方法的可重用性。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM