正在将JSON对象反序列化为WinRT(C#)中的运行时类型
本文关键字:类型 运行时 WinRT JSON 对象 反序列化 | 更新日期: 2023-09-27 18:24:06
我的在线服务(Azure Web service)有一个小型WinRT客户端应用程序。服务器向客户端发送一个JSON编码的对象(带有潜在的附加元数据),客户端的职责是将这些数据正确地反序列化为类,并将其转发给适当的处理程序。
目前,可以使用简单的对接收到的对象进行反序列化
TodoItem todo = JsonConvert.DeserializeObject<TodoItem>(message.Content);
但是,可以接收多种类型的项目。所以我现在想的是:
- 我在头服务器端包括类型信息,例如"内容对象:TodoItem"
- 我在客户端定义TodoItem的属性(见下文)
- 在收到来自服务器的消息后,我使用我定义的属性找到类
- 我使用解析的类型调用反序列化方法
(2中提到的属性示例。)
[BackendObjectType="TodoItem"]
public class TodoItem
然而,我对这种方法的问题是反序列化中的类型到泛型,因为我无法调用:
Type t = ResolveType(message);
JsonConvert.DeserializeObject<t>(message.Content);
我试图找到一些解决方案,并获得DeserializeObject的方法信息,并使用反射调用它似乎是可行的。然而,GetMethod()在WinRT中不存在,我也找不到可以用来检索DeserializeObject的通用版本的替代方法(因为按名称获取会给我非通用重载)。我不介意使用反射和GetMethod,因为我可以缓存(?)这些方法,并在每次收到消息时调用它们,而不必每次都解析它。
那么,我如何实现后一部分和/或有其他方法来实现这一点呢?
好吧,当我发现该方法的DeserializeObject(string,Type,JsonSerializerSettings)重载时,我觉得这一开始根本不是问题。它工作得很出色。然而,我仍然希望听到一些关于该方法的反馈意见。您认为使用属性作为解析类型名称的一种方法合理吗?或者有更好的方法吗?不过,我不想直接使用类名,因为我不想冒任何中间人初始化任何东西的风险。
就在几分钟前,我们发布了另一种方法来满足您的需求。请看这里,如果你有任何问题,请随时提问:
JSON 反序列化中的问题
试试这个
http://json2csharp.com/
把你的Json字符串放在这里,它会生成一个类
然后
public static T DeserializeFromJson<T>(string json)
{
T deserializedProduct = JsonConvert.DeserializeObject<T>(json);
return deserializedProduct;
}
var container = DeserializeFromJson<ClassName>(JsonString);