dynamic data = JsonConvert.DeserializeObject(result);
foreach (var field in data)
{
var deserializedData = new DeserializedData
{
Label = field.Key.ToObject<string>(),
Content = field.Value.ToObject<string>()
};
}
注意:data={"name":"test"}错误:"Newtonsoft.Json.Linq.JProperty"不包含"Key"的定义
我想我理解问题所在,但我不确定是否有实现这种行为的方法,或者是否有不同的方法来处理这样的动态关键价值场景。密钥会更改,所以我不知道它是名字、电话、电子邮件还是其他字段。。。
为了将返回的data
的子级迭代为IEnumerable<KeyValuePair<string, JToken>>
,您需要显式地将反序列化的对象声明为JObject
:
var data = JObject.Parse(result);
foreach (var field in data)
{
var deserializedData = new DeserializedData
{
Label = field.Key,
Content = field.Value.ToObject<string>()
};
}
执行dynamic data = JsonConvert.DeserializeObject(result);
时,foreach
最终调用基类JToken
中的IEnumerable<JToken>
迭代器。也就是说,以下也起作用:
dynamic data = JsonConvert.DeserializeObject(result);
foreach (var field in data)
{
// "field" happens to be of type JProperty
var deserializedData = new DeserializedData
{
Label = field.Name,
Content = field.Value.ToObject<string>()
};
}
尽管我更喜欢使用JObject
的强类型版本,因为在编译时可以进行更多的检查。
根据文档,JProperty的值包含键,JProperty's children是值。源