C# 使用反射将JSON反序列化为不同的类
我正在开发windows phone 8.1应用程序。我正在使用RESTAPI,API会返回JSON数据。 我想创建一个方法,这样每次调用API时,我只需将要对其进行反序列化的类的类型作为参数发送,然后将反序列化的数据获取到该模型的对象中。我当前的代码如下所示: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
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)