2016-08-03 1 views
1

私はWindows Phone 8.1アプリケーションで作業しています。私はREST APIを使って作業していて、API APIを使ってJSONデータを返します。 私はAPIを呼び出すたびに、パラメータとして逆シリアル化されるクラスの型を送信し、逆モデル化されたデータをそのモデルのオブジェクトに渡すというメソッドを作成したいとします。私の現在のコードは次のようになります。Reflectionを使用してJSONを異なるクラスにデシリアライズ

public static async Task GetAPIData(Type referanceModel, string serviceUrl) 
    { 
     HttpClient client = new HttpClient(); 
     var responce = await client.GetAsync(new Uri(serviceUrl)); 
     JArray arr = JArray.Parse(await response.Content.ReadAsStringAsync()); 

     foreach (JObject obj in arr.Children<JObject>()) 
     { 
      JsonSerializerSettings settings = new JsonSerializerSettings(); 
      settings.NullValueHandling = NullValueHandling.Ignore; 
      settings.MissingMemberHandling = MissingMemberHandling.Ignore; 

      var rcvdData = JsonConvert.DeserializeObject<referanceModel>(obj.ToString(), settings); 


      //var method = typeof(JsonConvert).GetTypeInfo().GetDeclaredMethods("DeserializeObject").ToList()[5].MakeGenericMethod(ReferanceModel); 


      //var rcvd = method.Invoke(null, new object[] { obj.ToString(), settings }); 
     } 

    } 

上記のコードはreferanceModelが可変であることを私にエラーを示します。コメントしたコードも試しましたが、うまくいきません。

2つのクラスはAllvehDataとAllDevicesDataです。これらのクラスは両方とも私が話題に多くのことを検索しthisを見つけましたが、理解することができなかったThisUser

public class AllVehData 
{ 
    public string Colour { get; set; } 
    public string Make { get; set; } 
    public string model { get; set; } 
    public string Year { get; set; } 


} 


public class AllDevicesData 
{ 
    bool has_tracking_device { get; set; } 
    int drive_type_name_string_id { get; set; } 
    public int vehicle_status { get; set; } 
    public int cargo_capacity { get; set; } 
    public int fuel_capacity { get; set; } 
} 

のインスタンスでThisUserClassと呼ばれるシングルトンクラスの内部にあります。私は助けが必要です。

答えて

0

この場合、一般的なオーバーロードJsonConvert.DeserializeObject<>(string, JsonSerializerSettings)は必要ありません。代わりにJsonConvert.DeserializeObject(string, Type, JsonSerializerSettings)オーバーロードを使用してください:あなたはジェネリックを使用すると

var rcvdData = JsonConvert.DeserializeObject(obj.ToString(), referanceModel, settings); 

- クラスやメソッドのいずれかを - タイプTypeの変数のとは対照的に、あなたは、一般的なパラメータの代わりに実際の型を渡す必要があります。これは、コンパイル時エラーが発生する理由です。例えば。文字列のリストを初期化するために、あなたが行うことはできません。

var theStringVar = string.Empty; 
var myList1 = new List<theStringVar>(); // Here we get the compile time error. 

// OR 

var theTypeVar = typeof(string); 
var myList2 = new List<theTypeVar>(); // That won't work either. 

は、代わりに明示的stringタイプを指定する必要があります。私は、メソッドを呼び出す方法

var myList3 = new List<string>(); // This works just fine. 
+0

@BozhdarStoinevはあなたが私に教えてもらえます。 –

+0

例に従ってください...あなたが直面している問題は? –

+0

あなたのコードをJsonの部分に追加しました。問題はrcvdDataに値を更新しないということです。 rcvdDataは、すべてのヌル値を持つAllVehDataクラスのオブジェクトになります。 –

関連する問題