2013-08-09 5 views
6

いずれかのJSON文字列の次の2つの形式の1:JSONをデシリアライズするより良い方法はありますか?返すことがあります。私は、APIに投稿しています

{ 
"MessageType": 6, 
"Message": "Unable to SAVE new record. Invalid posted data." 
} 

または

{ 
"Model": { 
    "Id": "1-6Q0RZ9", 
    ... 

     }, 
"ResponseResult": { 
    "MessageType": 10, 
    "Message": "Successfully saved, Record Id = 1-6Q0RZ9" 
        } 
} 

私はのMessageTypeから結果を取得する必要があり、すべての場合は試してみました私は結果を読むことを考えることができます。なぜなら、構文またはキーを取得する:valueは各JSON文字列ごとに異なり、いずれかをトリガーする他のフラグは存在しないからです。だから私が使用したコードは:

string result = eml.PostData("API/Save", dataJSON.ToString()); 
var returnresult = new JavaScriptSerializer().Deserialize<dynamic>(result); 
try { 
    var responseresults = returnresult["ResponseResult"]; 
    rr = responseresults["MessageType"]; 
    rrtxt = responseresults["Message"]; 
} catch (Exception ex) { 
    rr = returnresult["MessageType"]; 
    rrtxt = returnresult["Message"]; 
} 

素晴らしいです。有効なDb投稿がある場合、TRY文によって正しく解析される2番目のJSONを返します。そうでない場合、「キーが見つかりません」というエラーがスローされ、CATCH文(最初のJSONの例)で返された文字列が解析されます。明らかにこれは恐ろしいコードですが、私はこれを行うための別の方法を考えることができません。誰かが提案をしているのだろうかと思っていました。 (どうか?)

Thanxを事前に入力してください。

+9

私は強く – AlliterativeAlice

+0

私はJSON.Netと同様の問題を持っていた、知る方法がない[Json.NET](http://james.newtonking.com/projects/json-net.aspx)をお勧めしますあなたが私の場合にそれを持っているまであなたが得ようとしている文字列。 –

+0

JSON.Netには同じ問題がありますが、使用しているJSONパーサーよりもはるかに優れています。 – bluetoft

答えて

1

各戻り値の型のすべてのプロパティを持つオブジェクトへの応答を逆シリアル化してから、値をチェックするのはどうでしょうか?

public class ReturnObject 
{ 
    public YourModel Model {get;set;} 
    public ResultObject ResponseResult {get;set;} 
    public int? MessageType {get;set;} 
    public string Message {get;set;} 
} 


string result = eml.PostData("API/Save", dataJSON.ToString()); 
var returnresult = new JavaScriptSerializer().Deserialize<ReturnObject>(result); 
{ 
    if(returnresult.MessageType.HasValue) 
    { 
    var messageType = returnResult.MessageType.Value; 
    etc etc. 
    } 

} 
+0

ありがとうございました。あなたのパブリックYourModel Model {get; set;}またはResultObject ResponseResultによって何が参照されるべきであるかについてはあまりよく分かりません。それらを使用すると型や名前空間が見つからないため、MessageTypeが0(APIは1〜17の結果しか返されません)が返されます。私の無知を許してください、助言してください。 –

+0

あなたは彼らのデータ構造も知っていて、それらのクラスを作成する必要があります。 – bluetoft

+0

私は戻り値の整数を最初にゼロに設定しています。したがって、if文が明らかにtrueを返すことはありません。 –

関連する問題