如何打开反序列化的 json 的 class 类型?

How to switch on deserialized json's class type?

我得到一个 json,反序列化可以是任何 class 说:

  1. 问题

  2. 回答

  3. 评论

所以我需要根据 json 所属的 class 进行切换。

目前我正在使用它来反序列化。但问题是如果我使用这个,我正在预谋我会收到什么类型。

Question question = new JavaScriptSerializer().Deserialize<Question>(payload);

但我想这样做:

var jsonType = ParseJson(payload);
switch (jsonType)
{
   case Question: {Question question = new JavaScriptSerializer().Deserialize<Question>(payload); break;}
   case Answer: ...
   case Comment: ...
}

这可能真的很棘手。如果 "type" 字段包含值 "Question"、"Answer" 或 "Comment",您可以打开它。如果没有,您将不得不打开其他东西并将其用作隐式标记。这可能很危险 if/when 有些事情会发生变化。

无论如何,您可以尝试 Newtonsoft JSON.NET,特别是 JObjectTryGetValue(我不知道 Microsoft 的 JavaScriptSerializer 中是否有等效项):

    var jsonString = "{ \"foo\" : \"bar\" }";
    var obj = JObject.Parse(jsonString);

    if(obj.TryGetValue("foo", out JToken val1))
    {
        Console.Write("Foo is in there!");
    }

在该示例中,val1 包含值 "bar"。

我建议使用 JSON.NET 而不是 JavaScriptSerializer

如果 ParseJSON return 类型为 QuestionAnswer 和 ... 的对象,您可以使用以下解决方法:

var jsonType = ParseJson(payload);
switch (jsonType.GetType().FullName)
{
   case "YourAssembly.Question": {Question question = new JavaScriptSerializer().Deserialize<Question>(payload); break;}
   case "YourAssembly.Answer": ...
   case "YourAssembly.Comment": ...
}