正在将JSON对象反序列化为WinRT(C#)中的运行时类型

本文关键字:类型 运行时 WinRT JSON 对象 反序列化 | 更新日期: 2023-09-27 18:24:06

我的在线服务(Azure Web service)有一个小型WinRT客户端应用程序。服务器向客户端发送一个JSON编码的对象(带有潜在的附加元数据),客户端的职责是将这些数据正确地反序列化为类,并将其转发给适当的处理程序。

目前,可以使用简单的对接收到的对象进行反序列化

TodoItem todo = JsonConvert.DeserializeObject<TodoItem>(message.Content);

但是,可以接收多种类型的项目。所以我现在想的是:

  1. 我在头服务器端包括类型信息,例如"内容对象:TodoItem"
  2. 我在客户端定义TodoItem的属性(见下文)
  3. 在收到来自服务器的消息后,我使用我定义的属性找到类
  4. 我使用解析的类型调用反序列化方法

(2中提到的属性示例。)

[BackendObjectType="TodoItem"]
public class TodoItem 

然而,我对这种方法的问题是反序列化中的类型到泛型,因为我无法调用:

Type t = ResolveType(message);
JsonConvert.DeserializeObject<t>(message.Content);

我试图找到一些解决方案,并获得DeserializeObject的方法信息,并使用反射调用它似乎是可行的。然而,GetMethod()在WinRT中不存在,我也找不到可以用来检索DeserializeObject的通用版本的替代方法(因为按名称获取会给我非通用重载)。我不介意使用反射和GetMethod,因为我可以缓存(?)这些方法,并在每次收到消息时调用它们,而不必每次都解析它。

那么,我如何实现后一部分和/或有其他方法来实现这一点呢?

正在将JSON对象反序列化为WinRT(C#)中的运行时类型

好吧,当我发现该方法的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);