3

RestSharp の質問の処理中にエラーが発生しました。

リクエスト自体にエラーがある場合、サーバーは別の Json 回答を返します。これは、別の POCO オブジェクトに非シール化する必要があります。どこでこれを処理できますか?

たとえば、通常の答え:

{status: 100, message: { ** list of items ** }}

エラーの答え:

{status: 404, message: { ** error details ** }}

したがって、それらは 2 つの異なる POCO (ただし、ステータスを持つ 1 つの親を持つことができます) であるため、異なる方法で解析する必要があります (ステータスを読み取って、結果を逆シリアル化する方法を選択できれば完璧です)。

wp7非同期ライブラリでRestSharpを使用しているため、リクエストは次のように表示されます

var response = await client.ExecuteAsync<NormalPOCO, ErrorPOCO>(request);

しかし、どこで逆シリアル化自体をオーバーライドできますか?

4

2 に答える 2

2

この種の条件付きデシリアライゼーションはサポートされていませんが、私は RestSharp を使い続けます。

class StatusPOCO { public int Status { get; set; } }
class NormalPOCO : StatusPOCO { ... }
class ErrorPOCO : StatusPOCO { ... }

var response = await client.ExecuteAsync<StatusPOCO>(request);
// restsharp's deserializer:
IDeserializer deserializer = new JsonDeserializer();
if (response.Data.status != 100)
   error = deserializer.Deserialize<ErrorPOCO>(response);
else
   normal = deserializer.Deserialize<NormalPOCO>(response);
于 2013-07-17T07:10:25.750 に答える
0

最終的に、async と Json.net を使用して HttpWebRequest 経由で手動リクエストを送信しました。こんな感じです

        var stringResult = await productSearchDataService.LaunchSearchAsync(name, label); // Sends HttpWebRequest
        if (String.IsNullOrEmpty(stringResult )) { return; }     // TODO: notify no internet
        var status = (int)JObject.Parse(stringResult)["status"];            
        if (status != 100) { return; }            // TODO: notify some shit happened
        try
        {
            private var parsedResult = await TaskEx.Run(() => JsonConvert.DeserializeObject<NormalAnswerPoco>(stringResult));

        ***
        }
于 2013-05-02T16:18:01.863 に答える