C# 调试JSON.NET

C# 调试JSON.NET,c#,xamarin.ios,json.net,C#,Xamarin.ios,Json.net,我使用JSON.NET来反序列化从web服务返回的一些JSON。不幸的是,我犯了以下错误: 无法将JSON数组反序列化为类型 'System.Collections.Generic.Dictionary'2[System.String,System.String]' 但我不知道如何调试它。有没有办法让它告诉我什么是令人讨厌的JSON?甚至是它试图反序列化它的目的?不幸的是,这是一个更大的对象层次结构的一部分,所以它不仅仅是一个简单的JSON片段。我已经尝试过逐步浏览代码,但是代码太多,文档也很少

我使用JSON.NET来反序列化从web服务返回的一些JSON。不幸的是,我犯了以下错误:

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


但我不知道如何调试它。有没有办法让它告诉我什么是令人讨厌的JSON?甚至是它试图反序列化它的目的?不幸的是,这是一个更大的对象层次结构的一部分,所以它不仅仅是一个简单的JSON片段。我已经尝试过逐步浏览代码,但是代码太多,文档也很少。如果它至少能告诉我有问题的部分,那么我可以看看我是否搞错了对象定义或其他什么。

根据您提供的信息,我会首先查找具有Dictionary类型属性的对象。这可能是您的问题类。

在浏览了大量代码后,找到了应该看的地方。第1118ish行JsonSerializerInternalReader是:

          SetPropertyValue(property, reader, newObject);
若你们在那个里放一个断点并观察“属性”,你们可以看到什么属性被序列化了。因为它是按照json字符串的顺序进行的,所以您可以观察并查看最后一个成功设置的字符串。然后您至少知道序列化程序在哪里失败


但是,如果JSON.net在错误中至少引发了属性名,这将是很有帮助的,但在这之前,这似乎是下一个最好的选择。

如果您想将要从JSON转换为C类的内容反序列化,JSON.net中内置了一些东西。只需创建一个设置对象并将其传递到反序列化对象调用中:

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);
}
if(!string.IsNullOrEmpty(json))
{
var设置=新的JsonSerializerSettings
{
错误=(发送方,参数)=>
{
if(System.Diagnostics.Debugger.IsAttached)
{
System.Diagnostics.Debugger.Break();
}
}
};
结果=JsonConvert.DeserializeObject(json,设置);
}
然后,当反序列化过程中出现错误时(如不匹配的C#class->json对象),它将在调试器中中断。检查args对象,您将看到一个名为CurrentObject的属性。这是解析器试图将JSON反序列化为的C#类(并将提供有关错误的详细信息)


希望能有所帮助。

我很好奇,一个对象中有多少类被序列化?而不是一个对象。进入对象的层次结构。我正在使用由USGS.gov托管的ARCGis web服务。ARCGis有一些服务可以在层次结构中返回数百个对象。他们还做一些非常古怪的事情,比如基于参数的抽象类型解析(使用源代码Luke!并将其贡献回来;-)是的,我可能不得不这样做。如何在vb.net中使用上述代码解决相同的问题?太好了我必须打开中详细介绍的
MissingMemberHandling
,才能让它正常工作。回答得好。在我的例子中,这没有给出任何错误。原因是我的一处房产不是“公共的”。啊!