我遇到了RestSharp将返回内容反序列化到我的类中的问题。从我所有的搜索来看,我似乎正确地做到了这一点。我宁愿使用RestSharp的反序列化器而不是像Newstonsoft的Json.NET那样使用其他软件包。
我正在做的是向GoToWebinar发送针对所有预定网络研讨会列表的API请求:
var client = new RestClient(string.Format("https://api.citrixonline.com/G2W/rest/organizers/{0}/upcomingWebinars", "300000000000239000"));
var request = new RestRequest(Method.GET);
request.AddHeader("Authorization", "OAuth oauth_token=" + System.Configuration.ConfigurationManager.AppSettings["GoToWebinar"]);
var response2 = client.Execute<List<RootObject>>(request);
如您所见,我想获得一个对象'RootObject'的列表(如下所示)。我在response2.Content:
中收到以下JSON响应[
{
"webinarKey":678470607,
"subject":"Easton's Wild Rice Cooking Demo",
"description":"Lorem ipsum dolor sit amet, consectetur adipiscing elit.",
"organizerKey":300000000000239551,
"times":[{"startTime":"2012-05-09T15:00:00Z","endTime":"2012-05-09T16:00:00Z"}],
"timeZone":"America/Denver"
},
{
"webinarKey":690772063,
"subject":"Easton's Match Making Service",
"description":"Lorem ipsum dolor sit amet, consectetur adipiscing elit.",
"organizerKey":300000000000239551,
"times":[{"startTime":"2012-05-09T15:00:00Z","endTime":"2012-05-09T16:00:00Z"}],
"timeZone":"America/Denver"
}
]
我使用上面的JSON结果使用http://json2csharp.com创建了以下对象:
public class RootObject
{
public int webinarKey { get; set; }
public string subject { get; set; }
public string description { get; set; }
public long organizerKey { get; set; }
public List<Time> times { get; set; }
public string timeZone { get; set; }
}
public class Time
{
public string startTime { get; set; }
public string endTime { get; set; }
}
问题是response2.Data总是空的。出于某种原因,反序列化失败了,我不知道为什么。我的目标是能够使用foreach循环来迭代结果:
foreach(RootObject r in response2.Data)
{
lblGoToWebinar.Text += r.webinarKey.ToString() + ", ";
}
关于反序列化失败原因的任何想法?
答案 0 :(得分:80)
基于@ agarcian的上述建议,我搜索了错误:
restsharp根级别的数据无效。第1行,第1位。
找到了这个论坛:http://groups.google.com/group/restsharp/browse_thread/thread/ff28ddd9cd3dde4b
基本上,我认为client.Execute能够自动检测返回内容类型是错误的。它需要明确设置:
var request = new RestRequest(Method.GET);
request.OnBeforeDeserialization = resp => { resp.ContentType = "application/json"; };
这可以在RestSharp的文档中更清楚地引用。希望这会帮助其他人!
答案 1 :(得分:1)
晚会:您需要找到您获得的回复的实际内容类型。服务器不一定会回应您请求的Accept标头中的任何内容类型。对于谷歌的API,我得到了一个文本/简单的回复,所以这个advice from the group为我工作。
public T Execute<T>(string url, RestRequest request) where T : new()
{
var client = new RestClient();
// tell RestSharp to decode JSON for APIs that return "Content-Type: text/plain"
client.AddHandler("text/plain", new JsonDeserializer());
...
如果它可以在一个地方完成,例如上面的共享Execute方法,而不是在创建每个请求的任何地方强制使用OnBeforeDeserialization的响应类型,那么它也更整洁。
答案 2 :(得分:0)
我遇到了同样的问题,上面的答案都没有帮助。
这是我的回答课:
public class SomeResponse
{
public string string1;
public string string2;
}
问题是人为错误-我忘了包含get / set访问器。我不经常使用C#并忘记了对它们的需求。
public class SomeResponse
{
public string string1 { get; set; }
public string string2 { get; set; }
}
希望这可以帮助某个人。