2

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

目前,接收到的对象可以用一个简单的反序列化

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

但是,可以收到多种类型的物品。所以我目前的想法是这样的:

  1. 我在标头服务器端包含类型信息,例如“Content-Object: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,因为我可以缓存(?)方法并在每次收到消息时调用它们,而不必每次都解决它。

那么我如何实现后一部分和/或有另一种方法来解决这个问题?

4

3 回答 3

2

好吧,我觉得这根本不是一个真正的问题,因为我发现了该方法的 DeserializeObject(string, Type, JsonSerializerSettings) 重载。它工作得很好。但是,我仍然希望听到有关该方法的一些反馈。您认为使用属性作为解析类型名称的方法是合理的还是有更好的方法?不过,我不想直接使用类名,因为我不想冒任何中间人能够初始化任何东西的风险。

于 2013-07-19T12:20:49.280 回答
0

就在几分钟前,我们发布了另一种方法来做你想做的事。请看这里,如果您有任何问题,请随时提出:

JSON反序列化的问题

于 2013-07-19T12:19:05.747 回答
0

试试这个

http://json2csharp.com/

把你的 Json 字符串放在这里它会生成一个类

然后

 public static T DeserializeFromJson<T>(string json)
    {
        T deserializedProduct = JsonConvert.DeserializeObject<T>(json);
        return deserializedProduct;
    }

 var container = DeserializeFromJson<ClassName>(JsonString);
于 2013-07-19T12:22:33.987 回答