我有一个问题,那就是如何做好。
我有一个带有JSON的字符串,想把它改成class。
我知道我可以使用下面的代码:
var json = JsonConvert.DeserializeObject<MyClass>(stringJson);问题是我有几个类,不知道如何很好地选择应该使用哪个类。
我知道一种方法,但我认为它是令人讨厌的。例如:
try
{
var json = JsonConvert.DeserializeObject<MyClass1>(stringJson);
}
catch()
{}
try
{
var json = JsonConvert.DeserializeObject<MyClass2>(stringJson);
}
catch()
{}还有另一个原因要做吗?
编辑:
我有8-10个我可以得到的不同版本,在所有版本中,我知道它会是什么样子(版本的数量可以改变)。
发布于 2018-05-09 05:56:48
方法1
正如我所评论的,在这种情况下,您应该使用object:
var json = JsonConvert.DeserializeObject<JObject>(stringJson);在你的JObject中,你应该发送你的类并switch它,如下所示:
string type = json["type"].ToString();
switch(type)
{
case "MyClass":
//do whatever...
break;
case "MyClass1":
//do whatever...
break;
case "MyClass2":
//do whatever...
break;
}方法2
我写了一个错误,是的,我错过了this (你可以使用ToObject方法):
var json = JsonConvert.DeserializeObject<JObject>(stringJson);
string type = json.ToObject<object>().GetType().Name;并像Method 1中那样执行switch
方法3
此外,还可以从base class执行inherit操作
public class MyClass
{
}
public class MyClass1 : MyClass
{
}
public class MyClass2 : MyClass
{
}
//And so on...如果这不是你需要的,请告诉我。
发布于 2018-05-09 05:58:35
您可以解析为JObject,根据自己的规则选择确切的类型。你甚至可以使用LINQ和其他花哨的东西。
例如,让我们以消息结构为例:
{
"type": "info",
"data" : {
}
}然后你就有了它:
JObject parsed = JObject.Parse(stringJson);
var type = parsed["type"].Value<string>();
switch(type)
{
case "info":
{
// got an info
// You can parse the exact property you need, not the whole object
var result = JsonConvert.DeserializeObject<Info>(parsed["data"].ToString());
break;
}
case "error":
{
// got an error
var result = JsonConvert.DeserializeObject<Error>(parsed["data"].ToString());
break;
}
}如果您不能控制json格式,您可以使用任何证据来确定确切的类型
https://stackoverflow.com/questions/50242512
复制相似问题