调试JSON.NET

bry*_*ich 9 c# json.net xamarin.ios

我正在使用JSON.NET反序列化从Web服务返回的一些JSON.不幸的是,我得到以下错误:

无法将JSON数组反序列化为类型'System.Collections.Generic.Dictionary`2 [System.String,System.String]'.

但我不知道如何调试它.有没有办法让它告诉我什么是令人讨厌的JSON?甚至它正在尝试将其反序列化为什么?不幸的是,这是更大的对象层次结构的一部分,所以它不仅仅是一个简单的JSON.我已经尝试逐步完成代码,但是它有数英里而且文档很少.如果它至少可以告诉我有问题的一块,那么我可以看看是否可能是我的对象定义或其他东西.

Bil*_*ser 22

如果你想要将你从json转换成C#类的内容反序列化,那么json.net就会内置一些内容.只需创建一个设置对象并将其传递给deserializeobject调用:

if (!string.IsNullOrEmpty(json))
{
   var settings = new JsonSerializerSettings
       {
           Error = (sender, args) =>
                   {
                       if (System.Diagnostics.Debugger.IsAttached)
                       {
                            System.Diagnostics.Debugger.Break();
                       }
                   }
       };

    result = JsonConvert.DeserializeObject<T>(json, settings);
}
Run Code Online (Sandbox Code Playgroud)

然后,当反序列化过程中出现错误时(如错误映射的C#类 - > json对象),它将在调试器中中断.检查args对象,您将看到一个名为CurrentObject的属性.这是解析器尝试将JSON反序列化的C#类(并将提供有关错误的详细信息).

希望有所帮助.


bry*_*ich 6

在浏览了大量代码后找出了该在哪里查看。第 1118 行 JsonSerializerInternalReader 是:

          SetPropertyValue(property, reader, newObject);
Run Code Online (Sandbox Code Playgroud)

如果您在那里放置一个断点并观察“属性”,您可以看到哪些属性正在被序列化。因为它是按照 json 字符串的顺序执行的,所以您可以观察并看到最后一个成功设置的。那么你至少知道序列化器在哪里失败了。

然而,如果 JSON.net 至少在错误中引发了属性名称,那将会很有帮助,但在此之前,这似乎是下一个最好的事情。