私はC#でテーブルREST API経由でServiceNowをいくつか呼び出すツールを作成しています。私は、RESTの呼び出しを行うためにRESTシャープを使用しており、JSON.netは結果を非直列化しています。これは、エラーを返さないクエリではうまくいくようです。ServiceNow REST APIからのJSONの解析が難しい
ただし、結果が見つからないなどのエラーが返された場合、エラーを解析しようとすると予期しないトークン例外が発生します。
を正確にJSONを返す「DataTableの期待StartArrayを読んで、StartObjectを得たときに予期しないJSONトークン」は、以下である:
{
"error": {
"message": "No Record found"
"detail": "Records matching query not found. Check query parameter or offset parameter"
}
"status": "failure"
}
私はいくつかの同様の問題を読み、自分のクラスを作ってみましたが、私は」きましたどのように正確に私はそれを実装する必要がありますか分からない。また、あなたがキャッチすることができ
var token = JToken.Parse(response.Content);
if (token.Type == JTokenType.Object && ((JToken)"failure").Equals(token["status"]))
{
// Handle error explicitly
return null;
}
var dataset = token.ToObject<DataSet>();
var results = dataset.Tables["result"];
return results;
:Webサービスが適切にエラーステータスを返していない、あなたはレスポンスがエラーかのように見えるかどうかをチェックし、その後、中間JToken
に解析することができることを考えると
あなたがエラーを取得するときに、HTTPステータスコードが異なって返されますかメッセージ?その場合は、レスポンスのステータスコードをチェックし、レスポンスをステータスコードによって異なる方法でデシリアライズすることができます。エラーオブジェクトに一致する単純なクラスを作成できます。返されるjsonのプロパティと一致します。 –
ええ、私はそれが404か何かを返すことを望んでいましたが、それ以上のテキストで200 OKです。 – Noobixide
私はこのアプローチに100%満足しているわけではありませんが、常に200に戻ると、キャッチブロック内の独自の「エラー」オブジェクトに常にデシリアライズを試みることができます。具体的には、 'UnexpectedTokenException'をキャッチし、代わりにエラーオブジェクトにデシリアライズを試みてください。一般的な 'catch(Exception e)'もそこに置いてください。 –