2016-04-07 32 views
1

私は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に解析することができることを考えると

+1

あなたがエラーを取得するときに、HTTPステータスコードが異なって返されますかメッセージ?その場合は、レスポンスのステータスコードをチェックし、レスポンスをステータスコードによって異なる方法でデシリアライズすることができます。エラーオブジェクトに一致する単純なクラスを作成できます。返されるjsonのプロパティと一致します。 –

+0

ええ、私はそれが404か何かを返すことを望んでいましたが、それ以上のテキストで200 OKです。 – Noobixide

+0

私はこのアプローチに100%満足しているわけではありませんが、常に200に戻ると、キャッチブロック内の独自の「エラー」オブジェクトに常にデシリアライズを試みることができます。具体的には、 'UnexpectedTokenException'をキャッチし、代わりにエラーオブジェクトにデシリアライズを試みてください。一般的な 'catch(Exception e)'もそこに置いてください。 –

答えて

1

JsonExceptionと明示的なエラーを確認してください。それは、エラーのためにJSONが偶然DataSetのためにJSONとして直列化復元することができないという事実に依存するので、私は本当にこの方法をお勧めしません:

try 
{ 
    try 
    { 
     var dataset = JsonConvert.DeserializeObject<DataSet>(response.Content); 
     var results = dataset.Tables["result"]; 

     return results; 
    } 
    catch (JsonException) 
    { 
     var token = JToken.Parse(response.Content); 
     if (token.Type == JTokenType.Object && ((JToken)"failure").Equals(token["status"])) 
     { 
      // Handle error explicitly 
      return null; 
     } 
     // OK, it's not an explicit error. rethrow 
     throw; 
    } 
} 
catch (Exception ex) 
{ 
    // Generic error in the code somewhere. 
    Debug.WriteLine(ex); 
    // ... Other error handling as required 
} 
+0

@Noobixide - 私はこの回答を終えて、結局あなたのコメントを読んでください。それでも答えが必要ですか? – dbc