0

Json.Netライブラリ(.NET v3.5用)を使用して、EBossCRMAPIからの応答の逆シリアル化を処理しています。私が見た限りでは、APIドキュメントはかなりむらがあるので、どのような応答を引き出すことができるかを確認するために自分でそれを調べる必要があります。

EBossApiResponse<T>APIが送り返したエラーメッセージのプロパティを提供する単一のラッパークラスと、タイプの逆シリアル化されたデータを含むプロパティT(クラスの基になるタイプとして機能する抽象基本クラスに制限される)が必要でした返されたデータをモデル化するために作成しました)。

私の最初の突っ込みは最初の問題を明らかにしました。有効なリクエストは、 https://ebosscrm.com/api.php/job_type.jsonなどのオブジェクトの配列を返すことができます。

Tこれは、の仮説に簡単に逆シリアル化されList<EBossJobType>ます。結果にはエラープロパティがないことに注意してください。

ただし、同じエンドポイントへの不正なリクエストは、異なるものを返します:https ://ebosscrm.com/api.php/job_type.json?search[foo]=1

この場合、。という名前の単一のプロパティを持つ単一のオブジェクトを含む配列が返されますmessage

(名前付きのパラメーターを持つことsearch[something]は有効であるが、foo決して有効ではない呼び出しがあることに注意してくださいsomething

明示的なエラーが返される可能性もあります。APIが例外をキャッチし、デバッグ情報を含むJSON応答をフォーマットしているように見えます:https ://ebosscrm.com/api.php/candidates.json?uid = 114&api_key = f34js3kj

この場合、返されるJSONは配列ではなく、単一のオブジェクトです。これらの異なる応答構造に対応する方法がわかりません。私の最初の考えは次のようなものを持つことでした:

protected bool IsNonDataResponse(string response)
{
    JObject o = JObject.Parse(response);
    return o.SelectToken("message") != null || o.SelectToken("error") != null;
}

このメソッドを使用して、正しいタイプに直接逆シリアル化するかEBossApiResponse<T>(trueの場合、エラーメッセージを入力しますが、.Dataプロパティ== nullのままにします)、または右List<EBossEntityType>に逆シリアル化し、新しいを作成して、EBossApiResponse<List<EBossEntityType>>そのプロパティを設定し.Dataます。

次に、オブジェクトではなく配列になるo.SelectToken("message")ため、これは機能しないことに気付きました。フォームのパターンを取得して、最初のアイテムのメッセージプロパティを取得できますかo.SelectToken()"[0].message"

これはどう?

JObject o = JObject.Parse(response);
JArray arr = o as JArray;
return (arr != null && (JObject)arr[0].SelectToken("message") != null)
        || o.SelectToken("error") != null;

それとも私は間違った木を完全に吠えていますか、そしてこのすべてにもっとエレガントな解決策がありますか?

4

1 に答える 1

9

はとの両方の基本クラスであるJObject.Parse()ためJToken.Parse()、少なくともで置き換えることができます。次に、結果がaまたはa (または整数のようなもの)であるかどうかを確認できます。JTokenJObjectJArrayJArrayJObjectJValue

var result = JToken.Parse(response);

if (result is JArray)
{
    // ...
}
else if (result is JObject)
{
    // ...
}

JTokenのドキュメントもご覧ください。

于 2012-11-02T09:18:41.223 に答える