我可以在C#中访问对象的字段吗?

时间:2014-04-19 12:48:47

标签: c# json json.net

我正在使用Newtonsoft.Json.JsonConvert.DeserializeObject(string str)将字符串转换为.Net对象。此字符串的实际类型可以是多个,并且没有其他信息来指示此字符串的类型。但我可以确认字符串消息是公共类的派生类对象,如Message,而Message中的字段可以告诉实际类型,Message有一个像{{int type这样的字段1}}。该字符串为MessageAMessageB或其他具有不同type的字符串。

如果我将它翻译成一个Object,我可以在visual studio调试器中看到这个Object完全具有Json字符串中描述的字段。但我无法访问这些字段。并将此对象转换为消息将导致错误的转换失败。

我现在正在做的是首先将字符串翻译成Message并查看类型,然后再翻译。它不是首选。那么我可以将其翻译成可以读取所有数据的内容吗?另一个选项是Dictionary,但我有一些数字字段。还有其他建议吗?

1 个答案:

答案 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
}