RestSharpが戻りコンテンツをクラスに逆シリアル化することに問題があります。私のすべての検索から、私はこれを正しく行っているようです。私は、NewstonsoftのJson.NETのような別のパッケージにフォールバックする必要があるよりも、RestSharpのデシリアライザーを使用したいです。
私がやっていることは、スケジュールされたウェビナーのすべてのリストについて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は常にNullです。何らかの理由で逆シリアル化に失敗しましたが、その理由はわかりません。私の目標は、foreachループを使用して結果を反復処理できるようにすることです。
foreach(RootObject r in response2.Data)
{
lblGoToWebinar.Text += r.webinarKey.ToString() + ", ";
}
逆シリアル化が失敗する理由についてのアイデアはありますか?
上記の@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のドキュメントでより明確に引用できます。うまくいけば、これは他の誰かを助けるでしょう!
パーティーに遅れる:取得していた応答のactualContent-Typeを見つける必要があります。サーバーは、リクエストのAcceptヘッダーのコンテンツタイプで必ずしも応答するとは限りません。 GoogleのAPIの場合、私はtext/plain応答を受け取ったので、これ グループからのアドバイス がうまくいきました。
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を使用して応答タイプを強制するのではなく、上記の共有のExecuteメソッドなど、1つの場所で実行できる方が便利です。