循环通用对象属性

时间:2016-05-13 16:33:55

标签: c# json json.net

我有一个存储在数据库中的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<string>();
    list.Add(key.GetValue());            

    // Add our substitution
    email.AddSubstitution($"--{ key.ToUpper() }--", list);
}

但失败是因为

  

'object'不包含'GetProperties'的定义

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

5 个答案:

答案 0 :(得分:3)

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);
        }
    }
}

答案 1 :(得分:2)

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);
}

答案 2 :(得分:0)

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

你应该致电:

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

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

答案 3 :(得分:0)

如果我正确理解了您的问题,您是否因为您的字段/密钥不是certian而未反序列化为具体对象?

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

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

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

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

var dict = yourJsonString.Deserialize<Dictionary<string, object>>();

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

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

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

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

如果您仍想查看您正在使用的按键列表:

dict.Keys;

答案 4 :(得分:0)

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

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

然后你可以访问任何类似的属性:

if (result.MyProperty != null)
{
}

您还可以循环浏览动态对象。

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