我有一个存储在数据库中的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'的定义
有谁知道如何解决这个问题?
答案 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的性质,你不会有任何静态类型的对象,因此动态关键字看起来很合适。