【发布时间】:2012-02-21 18:19:24
【问题描述】:
我正在使用 Newtonsoft JSON.NET 包来反序列化我的响应。这是从 Omniture 拉回可用指标的调用的示例响应。
[
{"rsid":"somersid",
"site_title":"somesitetitle",
"available_metrics":[
{"metric_name":"averagepagedepth","display_name":"Average Page Depth"},
{"metric_name":"averagetimespentonpage","display_name":"Average Time Spent on Page"},
{"metric_name":"averagetimespentonsite","display_name":"Average Time Spent on Site"},
{"metric_name":"averagevisitdepth","display_name":"Average Visit Depth"},
{"metric_name":"customersdaily","display_name":"Daily Unique Customers"},
{"metric_name":"customersloyal","display_name":"Loyal Customers"},
{"metric_name":"customersmonthly","display_name":"Monthly Unique Customers"},
{"metric_name":"customersnew","display_name":"New Customers"},
{"metric_name":"customersquarterly","display_name":"Quarterly Unique Customers"}
]
}
]
对于我想反序列化的类,我首先尝试了 svcutil 针对其架构生成的类。它正确创建了类,并且在反序列化简单对象时它们似乎可以工作。但是任何带有嵌套数组(如上)的东西都因“无法将 JSON 数组反序列化为类型”错误而失败。经过仔细检查,svcutil 生成的类使用如下数组:
public partial class report_suite_metrics {
public string rsid { get; set;} ;
public string site_title { get; set;} ;
public metric[] available_metrics { get; set;} ;
}
public partial class metric {
public string metric_name {get; set;}
public string display_name {get; set;}
}
也许 JSON.NET 正试图将该数组强制为我认为的通用列表。我看到的所有 JSON.NET 示例都使用 List 来处理子数组,所以我创建了新的类来使用 json2csharp 实用程序 (http://json2csharp.com/) 进行测试并得到了这个:
public class AvailableMetric {
public string metric_name { get; set; }
public string display_name { get; set; }
}
public class RootObject {
public string rsid { get; set; }
public string site_title { get; set; }
public List<AvailableMetric> available_metrics { get; set; }
}
看起来与所有 JSON.NET 示例完全一致。但它抛出了完全相同的错误:(什么给出?有人遇到过这种问题吗?这似乎是一个非常简单和常见的情况,所以我很惊讶它没有按预期工作。谢谢
【问题讨论】:
-
您在返回的单个项目周围有方括号;你是在反序列化为
report_suite_metrics[]还是report_suite_metrics?前者应该可以工作,后者会给你你看到的错误。 -
@meklarian 我不敢相信我错过了,这正是导致问题的原因,感谢您给了我第二眼!请继续发表您的评论作为答案,这样我就可以给予您信任,再次感谢!
标签: c# json serialization json.net