循环通用对象属性

我有一个存储在数据库中的JSON字符串,如下所示:

{ "Error": "Lol", "ErrorDate": "2016-05-13T10:43:27.6365795Z", "Application": "Business", "UserName": "Josh", "TraceSession": "moo" } 

表中的每个项目的JSON字符串都不同。 在我的应用程序中,我想将其反序列化为一个对象,但由于JSON始终不同,我无法创建模型。

目前我有这个:

 var jObject = JsonConvert.DeserializeObject(FieldNames); 

我认为可以工作,但现在我需要遍历属性以获取密钥名称和值。 我试过这个:

 // For each property in our oject foreach (var key in jObject.GetProperties()) { // Create a list var list = new List(); list.Add(key.GetValue()); // Add our substitution email.AddSubstitution($"--{ key.ToUpper() }--", list); } 

但它失败了,因为

‘object’不包含’GetProperties’的定义

有谁知道如何解决这个问题?

 var jsonData = "{\"Error\": \"Lol\",\"ErrorDate\": \"2016-05-13T10:43:27.6365795Z\",\"Application\": \"Business\",\"UserName\": \"Josh\",\"TraceSession\": \"moo\"}"; var jObj = JToken.Parse(jsonData); foreach (JProperty property in jObj.Children()) { Console.WriteLine(property.Name); Console.WriteLine(property.Value); } 

JObject本质上是一个词典。 您可以像这样遍历键/值:

 class Program { static void Main(string[] args) { const string json = "{ " + "\"Error\": \"Lol\", " + "\"ErrorDate\": \"2016-05-13T10:43:27.6365795Z\", " + "\"Application\": \"Business\", " + "\"UserName\": \"Josh\", " + "\"TraceSession\": \"moo\" " + " }"; var jobj = JObject.Parse(json); foreach (var prop in jobj) { Console.WriteLine("Key: {0}, Value: {1}", prop.Key, prop.Value); } } } 

您只能从类型而不是实例获取属性。

你应该致电:

 foreach (var key in jObject.GetType().GetProperties()) { } 

另外,在反序列化json时,您应该使用静态类型

根据您的要求,您可以使用动态关键字:

 dynamic result = JObject.Parse("{...}"); 

然后你可以访问这样的任何属性:

 if (result.MyProperty != null) { } 

您还可以循环遍历动态对象。

由于json的性质,你不会有任何静态类型的对象,因此动态关键字看起来非常合适。

如果我正确理解了您的问题,那么您不会反序列化为具体对象,因为您的字段/键不是certian?

在这种情况下,我发现将Json对象视为字符串/对象字典对,然后从那里使用它很方便。 我倾向于使用object作为我的价值因为我们的Json可以拥有各种各样的东西。 话虽如此,如果您确定您的值只是字符串,那么您可以使用字符串/字符串对并保存一些信息。 这可以通过以下位轻松实现:

一个帮助我们的扩展方法:(如果你的Json不是真正的Json,这将失败,所以如果你需要它,请将它包装在try / catch中。)

 public static T Deserialize(this string json) { return string.IsNullOrWhiteSpace(json) ? default(T) : JsonConvert.DeserializeObject(json); } 

其次是它的用法:(注意,静态调用它也可以保护你免受空值的影响,所以你可以随意使用它。)

 var dict = yourJsonString.Deserialize>(); 

现在回答你原来的问题,我们可以这样做:

 dict.ToList().ForEach(pair => { //Do your work with each pair here. }); 

我的一些同事讨厌使用Linq这样迭代,所以我们也可以这样做:

 foreach (var pair in dict) { //Work with each pair here. } 

如果您仍想查看您正在使用的密钥列表:

 dict.Keys;