2012-04-25 97 views
28

我遇到了RestSharp反序列化返回内容到我的类的问题。从我所有的搜索中,似乎我正确地做到了这一点。我宁愿使用RestSharp的反序列化器,也不愿意回退到像Newstonsoft的Json.NET这样的其他软件包。RestSharp不反序列化JSON对象列表,始终为空

什么我做的是做一个API请求GoToWebinar为计划网络研讨会的全部名单:

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" 
    } 
] 

我创建使用http://json2csharp.com使用上述JSON结果中的下列对象:

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() + ", "; 
} 

为什么反序列化失败的任何想法?

预先感谢您!

+2

你可以调试并查看'response2'对象来查看什么是原始值?你应该看看调试器是否有错误。 – agarcian 2012-04-26 18:00:37

+1

谢谢@agarcian!根据你的建议,我开始搜索一些内部错误,并在下面的答案中看到它。 – 2012-04-27 16:29:43

+0

很高兴它解决了! – agarcian 2012-04-29 01:10:25

回答

71

基础上@ agarcian的建议以上,我一派错误:

restsharp Data at the root level is invalid. Line 1, position 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的文档中更清楚地引用。希望这会帮助别人!

+2

指定'Method.GET'是多余的,不是吗? (这是默认的方法类型) – ashes999 2013-04-18 15:25:31

+0

@ ashes999,同意。 – 2013-04-22 21:36:35

+3

根据线程推荐的方法是:'client.AddHandler(“text/plain”,new JsonDeserializer())',这真的应该在文档中 – Rowan 2013-10-11 05:09:02

1

晚会:您需要找到实际您收到的回复的内容类型。服务器不一定会响应请求的Accept头中的任何内容类型。对于Google的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()); 
    ... 

这也是整洁,如果它可以在一个地方进行,如共享执行上述方法中,而不是强迫响应类型与OnBeforeDeserialization哪里创建的每个请求。