无法从反序列化数据中检索键和值信息

Cannot retrieve the key and Value info from the deserialized data

                dynamic data = JsonConvert.DeserializeObject(result);
                foreach (var field in data)
                {
                    var deserializedData = new DeserializedData
                    {
                        Label = field.Key.ToObject<string>(),
                        Content = field.Value.ToObject<string>()
                    };
                }

注:数据={"name":"test"} 错误:'Newtonsoft.Json.Linq.JProperty' 不包含 'Key'

的定义

我想我明白问题出在哪里,但我不确定是否有办法实现这种行为,或者是否有不同的方法来处理像这样的动态键值场景。 密钥将更改,所以我不知道它是名称还是 phone 或电子邮件或其他一些字段...

根据documentation the JProperty's value contains the key, and the JProperty's children are the values. source

为了将返回的 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 最终调用基 class JToken 中的 IEnumerable<JToken> 迭代器。 IE。以下也适用:

    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 的强类型版本,因为可以在编译时进行更多检查。