Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用反射将JSON反序列化为不同的类_C#_Json_Reflection_Deserialization - Fatal编程技术网

C# 使用反射将JSON反序列化为不同的类

C# 使用反射将JSON反序列化为不同的类,c#,json,reflection,deserialization,C#,Json,Reflection,Deserialization,我正在开发windows phone 8.1应用程序。我正在使用RESTAPI,API会返回JSON数据。 我想创建一个方法,这样每次调用API时,我只需将要对其进行反序列化的类的类型作为参数发送,然后将反序列化的数据获取到该模型的对象中。我当前的代码如下所示: public static async Task GetAPIData(Type referanceModel, string serviceUrl) { HttpClient client = new Http

我正在开发windows phone 8.1应用程序。我正在使用RESTAPI,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 });
        }

    }

我在这个话题上搜索了很多,发现了一些问题,但没有理解。我需要帮助。

在这种情况下,您不需要通用重载
JsonConvert.DeserializeObject(string,JsonSerializerSettings)
。相反,请使用
JsonConvert.DeserializeObject(字符串、类型、JsonSerializerSettings)
重载并执行以下操作:

var rcvdData = JsonConvert.DeserializeObject(obj.ToString(), referanceModel, settings);
使用泛型(类或方法)时,必须传递一个实际类型来代替泛型参数,而不是
类型的变量。这就是您得到编译时错误的原因。例如,为了初始化字符串列表,您不能执行以下操作:

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.

在这种情况下,您不需要泛型重载
JsonConvert.DeserializeObject(string,JsonSerializerSettings)
。相反,请使用
JsonConvert.DeserializeObject(字符串、类型、JsonSerializerSettings)
重载并执行以下操作:

var rcvdData = JsonConvert.DeserializeObject(obj.ToString(), referanceModel, settings);
使用泛型(类或方法)时,必须传递一个实际类型来代替泛型参数,而不是
类型的变量。这就是您得到编译时错误的原因。例如,为了初始化字符串列表,您不能执行以下操作:

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.

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