2016-08-29 21 views
2

私はJSONメッセージを返すWebサービスを消費しようとします。各メソッドは関連するJSONメッセージ(通常は配列)またはJSONエラーメッセージ(配列ではありません)を返します。 UserListとエラーメッセージのDeserialise 2種類のJSONメッセージ

例:

[ 
    { 
     "id":1, 
     "login":"john1", 
     "full_name":"John Smith" 
    }, 
    { 
     "id":2, 
     "login":"anne", 
     "full_name":"Anne Steward" 
    } 
] 

{ 
    "success":false, 
    " message":"Unknown login" 
} 

コードが期待したメッセージを知らないので、私はのUserListはBaseResponseから継承二つのクラス(エラーメッセージクラス)を作成しました。私はGetCarListなどの他のすべてのメソッドもエラーメッセージを返すのに適しているので、継承を使用しています。エラーフィールドを複数回宣言する必要はありません。それはスマートでなければなりません - 私はいつもUserListフィールドやエラーメッセージフィールドを同じオブジェクトに取得します。

問題は、UserListResponse JSONメッセージが配列であり、ErrorMessage JSONが配列ではないという点です。

JsonConvert.DeserializeObject(Of List(Of UserListResponse))(ReceivedJSONMessage) 

任意のアイデアスマートな方法でこれに取り組む方法:だからJSONはのUserListになりますが、JSONは、エラーメッセージが表示されますときに動作しないときに動作しますdeserialising?

答えて

1

戻り値のクラスが正しくjsonをデシリアライズするために働いていることが確かな場合は、本質的に「リストまたは文字列ですか?」とする必要があります。 1つのパスまたは他のパスを求める。

EDIT 8-30 私はあなたが実行されるまで知っていないことを逃したので、私の悪いです。 Functionの代わりにSub Routineの内部でロジックを実行し、その代わりロジックを渡して代わりに渡される汎用オブジェクトを調べることができます。これに似ています。

Private Sub DetermineReturn(obj As Object) 
    If obj.GetType = GetType(String) Then 
     Console.WriteLine(CType(obj, String)) 
    ElseIf obj.GetType = GetType(List(Of String)) Then 
     CType(obj, List(Of String)).ForEach(Sub(x) Console.WriteLine(x)) 
    Else 
     Console.WriteLine("UnKnOwN!1!") 
    End If 
End Sub 


Sub Main() 
    Dim testError = "Oh Shoot Error!" 
    Dim GoodStuff = New List(Of String)({"I", "am", "a", "list"}) 

    Console.WriteLine("FirstExample") 
    DetermineReturn(testError) 
    Console.WriteLine() 
    Console.WriteLine("SecondExample") 
    DetermineReturn(GoodStuff) 
    Console.WriteLine() 
    Console.WriteLine("ThirdExample") 
    DetermineReturn(1) 

    Console.ReadLine() 
End Sub 

は基本的にあなただけの内部に直接メソッドの代わりConsole.WriteLinesの「DetermineReturn」のあなたのJSONを変換するいずれかの作業を行うだろう。私は渡された 'obj'を解釈しているので、リフレクションを使用してその型を取得し、その型としてキャストすることは安全です。だから、DetermineReturn((YourJSONResult)のようなメソッドにJSON戻り値の引数を入れて、そのメソッドの中でオブジェクトに必要な変換を行います。

+0

ありがとうございました。私はそのアプローチを理解している。しかし、私はそれをデシリアライズしようとする前に、 "私はリストまたは文字列ですか?"をチェックするためにJSONをどこに置くべきか理解していません。 JsonConvert.DeserializeObjectを使って別の例を教えてください。 – Megrez7

+0

JSONConvert.DeserializeObject(Your API Call)で 'DetermineReturn'内の私の 'ReturnString'メソッドを置き換えることになります。あなたは本質的にリターンをジェネリックな「オブジェクト」としてキャストしています。行動の方向を決定するために入力を差別化するだけです。 – djangojazz

+0

ここでJSONメッセージをタイプしてそれを判別します。このメッセージは文字列です。したがって、非直列化の瞬間にのみ、JSONコンテンツを指定された型に逆シリアル化できるかどうかがわかります。だから私はこれを行う:Dim s = DetermineReturn(Of MyJSONString)? これまでJSONメッセージをUserListResponse(継承なしのクラス)にdeserializeしようとしましたが、これが失敗すると例外を捕捉してからBaseResponseにデシリアライズしています。最後に、私は両方を組み合わせた新しいクラスを作ります。 私はどのように例外を使用するのが好きではありませんが、私は実際にあなたの解決策を理解していません。 – Megrez7