使用Reflection将JSON反序列化为不同的类

时间:2016-08-03 11:18:48

标签: c# json reflection deserialization

我正在使用Windows Phone 8.1应用程序。我正在使用REST API,而api则返回JSON数据。 我想创建一个方法,每次调用API时,我只是将要反序列化的类的类型作为参数发送,然后将反序列化的数据发送到该模型的对象中。我目前的代码如下:

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,却没能理解。我需要帮助。

1 个答案:

答案 0 :(得分: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.