C# json反序列化以选择类

C# json反序列化以选择类,c#,json-deserialization,C#,Json Deserialization,我不知道怎样才能把它做好 我有带JSON的字符串,希望将其更改为类 我知道我可以使用以下代码: var json = JsonConvert.DeserializeObject<MyClass>(stringJson); var json=JsonConvert.DeserializeObject(stringJson); 问题是我有几个类,不知道如何很好地选择应该使用的类 我知道一种方法,但我认为这很糟糕。例如: try { var json = JsonConvert

我不知道怎样才能把它做好

我有带JSON的字符串,希望将其更改为类

我知道我可以使用以下代码:

var json = JsonConvert.DeserializeObject<MyClass>(stringJson);
var json=JsonConvert.DeserializeObject(stringJson);
问题是我有几个类,不知道如何很好地选择应该使用的类

我知道一种方法,但我认为这很糟糕。例如:

try
{
    var json = JsonConvert.DeserializeObject<MyClass1>(stringJson);
}
catch()
{}
try
{
    var json = JsonConvert.DeserializeObject<MyClass2>(stringJson);
}
catch()
{}
试试看
{
var json=JsonConvert.DeserializeObject(stringJson);
}
捕获()
{}
尝试
{
var json=JsonConvert.DeserializeObject(stringJson);
}
捕获()
{}
还有其他原因吗

编辑:

我可以得到8-10个不同版本的产品,在所有版本中,我都知道它的外观(版本数量可以更改)。

方法1 正如我所评论的,在这种情况下,您应该使用
object

var json = JsonConvert.DeserializeObject<JObject>(stringJson);
方法2 我写了一个错误,是的,我错过了(你可以使用ToObject方法):


如果这不是您需要的,请告诉我。

您可以解析到
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;
        }
}
JObject-parsed=JObject.Parse(stringJson);
var type=parsed[“type”].Value();
开关(类型)
{
案例“信息”:
{
//有消息吗
//您可以解析所需的确切属性,而不是整个对象
var result=JsonConvert.DeserializeObject(已解析[“数据”].ToString());
打破
}
案例“错误”:
{
//出错了
var result=JsonConvert.DeserializeObject(已解析[“数据”].ToString());
打破
}
}

如果您无法控制json格式,您可以使用任何证据来确定确切的类型

为什么不知道要反序列化的类型?那似乎。。。非常同意@MarcGravel,如果你不知道你在反序列化什么,在你反序列化之后你怎么知道该怎么处理它?我有8-10个不同版本可以得到,在所有版本中我都知道它会是什么样子。这并不奇怪。我们的情况完全一样。外部系统可以将序列化对象放入队列,但这些对象可以是多个通知之一。我们使用OP发布的方法,尝试反序列化,如果该方法失败,则尝试下一个方法。这是我们想出的最好的解决方案。反序列化到object中,然后使用GetType知道应该使用哪个类…第一个选项不起作用,因为我得到了“JObject”。第二,它应该如何工作?var json=JsonConvert.DeserializeObject(stringJson);?如果这是正确的形式,我将以这种方式获取异常。抱歉,请尝试以下操作:在第一个选项中。仍然否:对于第一个获取消息:“消息:“对象引用未设置为对象的实例。”“对于第三个获取异常,第二个仍然获取作业对象,您将获取对象空引用异常,因为您没有任何具有此名称的条目,你必须传递一个有这个名字的条目。我不明白。在2中,方法类型仍然是JObjcet,或者我应该写关于“对象”的smothing-alse?在这一行后面的1方法中:string type=json[“type”].ToString();我有例外,我应该改变“类型”?如果是,比什么?
public class MyClass 
{

}

public class MyClass1 : MyClass
{

}

public class MyClass2 : MyClass
{

}

//And so on...
{
    "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;
        }
}