簡體   English   中英

使用Reflection將JSON反序列化為不同的類

[英]Deserialize JSON into different classes using Reflection

我正在使用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; }
}

我在這個主題上搜索了很多,發現了這個但卻沒能理解。 我需要幫助。

在這種情況下,您不需要泛型重載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.

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM