【问题标题】:Cannot retrieve the key and Value info from the deserialized data无法从反序列化数据中检索键和值信息
【发布时间】:2015-09-11 01:14:45
【问题描述】:
                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”的定义

我想我理解问题所在,但我不确定是否有办法实现这种行为,或者是否有不同的方法来处理这样的动态键值场景。 密钥会改变,所以我不知道它是姓名、电话、电子邮件还是其他字段......

【问题讨论】:

    标签: c# asp.net json json.net deserialization


    【解决方案1】:

    为了将返回的data 的子代作为IEnumerable&lt;KeyValuePair&lt;string, JToken&gt;&gt; 进行迭代,您需要将反序列化的对象显式声明为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&lt;JToken&gt; 迭代器。 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 的强类型版本,因为可以在编译时进行更多检查。

    【讨论】:

    • 这太棒了......我喜欢强类型版本,我将实现它......再次感谢。
    【解决方案2】:

    根据documentation,JProperty 的值包含键,而 JProperty 的子项是值。 source

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-16
      • 1970-01-01
      • 2019-08-15
      • 2018-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多