处理json反序列化的错误

时间:2015-08-03 17:28:44

标签: c# .net json.net json-deserialization

如何从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中没有这样的属性,那么我认为它应该在“sender”中,它是JsonSerializer的实例,它包含许多属性,但在那里我也没有找到。 不明白,为什么这么酷的包,因为json.net没有包括这个。 String是一个引用类型,因此应该可以存储对errorEventArgs中相同字符串实例的引用,并且没有消耗额外内存进行复制的问题(在大json的情况下会降低性能)

2 个答案:

答案 0 :(得分:2)

通过将错误处理程序转换为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# Closures ExplainedClosures In C#

答案 1 :(得分:2)

我查看了template <class Derived> struct Event { }; struct MoveEvent: Event<MoveEvent> { MoveEvent(int x, int y) : x(x), y(y) { } int x, y; }; int main() { MoveEvent event{5, 4}; // NOW this is fine } ,并且该类中没有包含原始字符串的属性。但是你可以做类似于EZI的回答。

ErrorEventArgs方法的方法签名更改为以下内容:

OnError

然后在private void OnJsonError(object sender, ErrorEventArgs errorEventArgs, string jsonString) 构造中执行以下操作:

JsonSerializerSettings

这样,您可以在为原始作品添加最少行代码的同时保持var jsonSerializerSettings = new JsonSerializerSettings() { Error = (sender, errorEventArgs) => { OnJsonError(sender,errorEventArgs,jsonString); } }; 方法的可重用性。