C# json反序列化以选择类
我不知道怎样才能把它做好 我有带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
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;
}
}