2016-08-03 35 views
1

我正在研究windows phone 8.1应用程序。我正在使用REST API,并且API会返回JSON数据。 我想创建一个方法,每当我调用API时,我只发送它将被反序列化的类的类型作为参数,并将反序列化的数据转换为该模型的一个对象。我目前的代码如下所示:使用反射将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是一个变量的错误。我也尝试了评论代码,但它不起作用。

这两个类是:AllvehData和AllDevicesData。这两个类都称为ThisUserClass与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; } 
} 

的情况下一个单例类中我搜索的话题很多,发现this但未能理解。我需要帮助。

回答

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类的一个对象,全部为空值。 –