我正在使用Newtonsoft.Json.JsonConvert.DeserializeObject(string str)
将字符串转换为.Net对象。此字符串的实际类型可以是多个,并且没有其他信息来指示此字符串的类型。但我可以确认字符串消息是公共类的派生类对象,如Message
,而Message
中的字段可以告诉实际类型,Message
有一个像{{int type
这样的字段1}}。该字符串为MessageA
或MessageB
或其他具有不同type
的字符串。
如果我将它翻译成一个Object,我可以在visual studio调试器中看到这个Object完全具有Json字符串中描述的字段。但我无法访问这些字段。并将此对象转换为消息将导致错误的转换失败。
我现在正在做的是首先将字符串翻译成Message
并查看类型,然后再翻译。它不是首选。那么我可以将其翻译成可以读取所有数据的内容吗?另一个选项是Dictionary,但我有一些数字字段。还有其他建议吗?
答案 0 :(得分:5)
JsonConvert.DeserializeObject(string str)
,在JSON对象上使用时,返回JObject
。您可以直接使用此功能(例如,使用DeserializeObject<JObject>
明确键入),或使用dynamic
来访问其属性,例如
var data = @"{""type"": 1, ""otherProperty"": ""Hello!""}";
dynamic obj = JsonConvert.DeserializeObject(data);
if (obj.type == 1)
{
Console.WriteLine(obj.otherProperty); // prints Hello!
}
另外,您提到数字字段是使用字典时遇到的问题,但如果您将其设为Dictionary<string, dynamic>
,您可能会觉得使用它更容易:
var data = @"{""type"": 2, ""otherProperty"": 5}";
var dict = JsonConvert.DeserializeObject<Dictionary<string, dynamic>>(data);
if (dict["type"] == 2)
{
int i = (int)dict["otherProperty"]; // type is long, so cast is required if you want an int
Console.WriteLine(i); // prints 5
}