循环通用对象属性
我有一个存储在数据库中的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;