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

时间:2018-01-26 23:51:09

标签: c# asp.net json javascriptserializer

我得到了一个json,反序列化可以是任何一个班级的说法:

  1. 问题

  2. 答案

  3. 注释
  4. 所以我需要根据json所属的类进行切换。

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

    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: ...
    }
    

2 个答案:

答案 0 :(得分:1)

这可能非常棘手。如果有&#34;类型&#34;包含值&#34;问题&#34;,&#34;答案&#34;或&#34;评论&#34;的字段,您可以打开它。如果没有,您必须打开其他内容并将其用作隐式标记。如果/当某些事情发生变化时,这可能是危险的。

无论如何,您可以尝试使用Newtonsoft JSON.NET,特别是JObject TryGetValue(我不知道微软是否有相应的内容)。 s JavaScriptSerializer):

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

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

在该示例中,val1包含&#34; bar&#34;的值。

答案 1 :(得分:0)

我建议使用JSON.NET代替JavaScriptSerializer

如果ParseJSON返回类型为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": ...
}