2012-04-25 10 views
28

返品内容をクラスに逆シリアル化する際に問題があります。すべての私の検索から、私はこれを正しくやっているようです。私はRestSharpのデシリアライザを、NewstonsoftのJson.NETのような別のパッケージに戻すよりもむしろ使いたいと思う。RestSharpはJSONオブジェクトリストを逆シリアル化しません。常にNull

私が予定さウェビナーのすべてのリストについては、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を使用して、次のオブジェクトを作成しました:問題はresponse2.Dataは常にNULLである

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; } 
} 

。何らかの理由でデシリアライゼーションが失敗し、なぜかわからない。私の目標は、結果を反復処理するforeachループを使用できるようにすることです:

foreach(RootObject r in response2.Data) 
{ 
    lblGoToWebinar.Text += r.webinarKey.ToString() + ", "; 
} 

直列化復元が失敗する理由上の任意のアイデア?

ありがとうございます!

+2

'response2'オブジェクトをデバッグして見て、生の値を確認できますか?デバッガにエラーがあるかどうかを確認する必要があります。 – agarcian

+1

ありがとうございました!あなたの提案に基づいて、内部エラーのいくつかを検索し始め、私の答えで目に見えるものを見つけ出しました。 –

+0

うれしかった!!! – agarcian

答えて

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ができるようにするつもりだったと仮定して間違っていました戻りコンテンツの種類を自動検出します。これは、明示的に設定する必要があります。これはRestSharpのマニュアルでより明確に引用することができ

var request = new RestRequest(Method.GET); 
request.OnBeforeDeserialization = resp => { resp.ContentType = "application/json"; }; 

。うまくいけば、これは他の誰かを助けるでしょう!

+2

'Method.GET'を指定するのは冗長ですか? (それはデフォルトのメソッドタイプです) – ashes999

+0

@ ashes999、合意しました。 –

+3

スレッドによれば、推奨されるアプローチは 'client.AddHandler(" text/plain "、new JsonDeserializer())'です。これは実際にはドキュメントにあるべきです – Rowan

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で応答タイプを強制するよりも、上記の方法を実行するように一箇所で行うことができるかどうかも整然とです。

関連する問題