如何打开反序列化的 json 的 class 类型?
How to switch on deserialized json's class type?
我得到一个 json,反序列化可以是任何 class 说:
问题
回答
- 评论
所以我需要根据 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,特别是 JObject
的 TryGetValue
(我不知道 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 类型为 Question
、Answer
和 ... 的对象,您可以使用以下解决方法:
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": ...
}
我得到一个 json,反序列化可以是任何 class 说:
问题
回答
- 评论
所以我需要根据 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,特别是 JObject
的 TryGetValue
(我不知道 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 类型为 Question
、Answer
和 ... 的对象,您可以使用以下解决方法:
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": ...
}