【问题标题】:Deserialize JSON into different classes using Reflection使用反射将 JSON 反序列化为不同的类
【发布时间】:2025-12-05 03:05:01
【问题描述】:

我正在开发 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 });
        }

    }

上面的代码显示了referenceModel是一个变量的错误。我也尝试了注释代码,但它也不起作用。

这两个类是: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,但未能理解。我需要帮助。

【问题讨论】:

    标签: c# json reflection deserialization


    【解决方案1】:

    在这种情况下,您不需要泛型重载JsonConvert.DeserializeObject&lt;&gt;(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.
    

    【讨论】:

    • @BozhdarStoinev 请告诉我如何调用该方法。
    • 按照例子...你遇到什么问题?
    • 我将您的一段代码添加到 Json 部分,问题是它不会将值更新为 rcvdData。 rcvdData 成为所有空值的 AllVehData 类的对象。
    • 在这种情况下,obj.ToString() 不会生成与AllVehData 的结构相对应的 JSON 字符串。
    • 是的,解决了。我使用 ThisUserClass.ThisUser.AllVehData.GetType() 作为方法参数而不是 typeof(ThisUserClass.ThisUser.AllVehData)