【问题标题】:Loop trought Dictionary<string, object> only for a key in c#仅针对 c# 中的键循环遍历 Dictionary<string, object>
【发布时间】:2015-03-20 22:31:31
【问题描述】:

我有一个字符串和对象字典,我反序列化了这个 json 答案:

{"labels":[{"id":"1","descrizione":"Etichetta interna","tipo":"0","template_file":"et_int.txt"},{"id":"2","descrizione":"Etichetta esterna","tipo":"1","template_file":"et_ext.txt"}],"0":200,"error":false,"status":200}

使用代码:

var labels = new JavaScriptSerializer().Deserialize<Dictionary<string, object>>(json);   

现在我只想循环遍历“标签”键内的对象。 我试过了

foreach (var outer in labels["labels"]){/* code */}

但我得到了错误:

CS1579: foreach statement cannot operate on variables of type 'object' because 'object' does not contain a public definition for 'GetEnumerator'.

已解决用类替换字典,谢谢

【问题讨论】:

  • 您的标签对象看起来更像一个数组。尝试使用这些属性(id、decrizione 等)创建一个类并将您的对象反序列化为 Dictionary&lt;string, List&lt;MyLabelsClass&gt;&gt;
  • 试试这个 [link][1] 这将帮助你 [1]:stackoverflow.com/questions/348964/…

标签: c# object dictionary foreach key


【解决方案1】:

创建一个类来反序列化您的 json:

要创建类,您可以复制剪贴板中的 json 并使用

编辑/粘贴特殊/粘贴 JSON 作为类

在视觉工作室(我使用 vs2013)。

    [TestMethod]
    public void test()
    {
        string json = "{\"labels\" : [{\"id\" : \"1\",\"descrizione\" : \"Etichetta interna\",\"tipo\" : \"0\",\"template_file\" : \"et_int.txt\"}, {\"id\" : \"2\",\"descrizione\" : \"Etichetta esterna\",\"tipo\" : \"1\",\"template_file\" : \"et_ext.txt\"}],\"0\" : 200,\"error\" : false,\"status\" : 200}";
        var root = JsonConvert.DeserializeObject<Rootobject>(json);

        foreach (var label in root.Labels)
        {
            //Use label.Id, label.Descrizione, label.Tipo, label.TemplateFile
        }
    }

    public class Rootobject
    {
        public Label[] Labels { get; set; }
        public int _0 { get; set; }
        public bool Error { get; set; }
        public int Status { get; set; }
    }

    public class Label
    {
        public string Id { get; set; }
        public string Descrizione { get; set; }
        public string Tipo { get; set; }
        public string TemplateFile { get; set; }
    }

【讨论】:

    【解决方案2】:

    你能试试下面的sn-p吗? 可能对你有帮助。

    foreach (var item in labels["labels"] as ArrayList)
            {
                Console.Write(item);
            }
    

    【讨论】:

      【解决方案3】:

      一个可能的解决方案:

      static void Main(string[] args) {
      
          string json = @"{'labels':[{'id':'1','descrizione':'Etichetta interna','tipo':'0','template_file':'et_int.txt'},{'id':'2','descrizione':'Etichetta esterna','tipo':'1','template_file':'et_ext.txt'}],'0':200,'error':false,'status':200}";
          var labels = new JavaScriptSerializer().Deserialize<Dictionary<string, object>>(json);
          IEnumerable inner_labels = labels["labels"] as IEnumerable;
          if (inner_labels != null) {
              foreach (var outer in inner_labels) { 
                  Console.WriteLine(outer);
              }
          }
      
      }
      

      否则,您可以使用反序列化信息创建一个类,并指示反序列化器将您的 json 字符串反序列化为该类型:

      using System;
      using System.Collections.Generic;
      using System.Web.Script.Serialization;
      using System.Xml.Serialization;
      
      [Serializable]
      public class JsonData {
      
          [XmlElement("labels")]
          public List<JsonLabel> labels { get; set; }
      
          [XmlElement("0")]
          public int zero { get; set; }
      
          [XmlElement("error")]
          public bool error { get; set; }
      
          [XmlElement("status")]
          public int status { get; set; }
      
      
      }
      
      [Serializable]
      public class JsonLabel {
          [XmlElement("id")]
          public int id { get; set; }
      
          [XmlElement("descrizione")]
          public string descrizione { get; set; }
      
          [XmlElement("tipo")]
          public int tipo { get; set; }
      
          [XmlElement("template_file")]
          public string template_file { get; set; }
      
      }
      
      class Program {
      
      
          static void Main(string[] args) {
              string json = @"your json string here...";
              var jsonData = new JavaScriptSerializer().Deserialize<JsonData>(json);
              foreach (var label in jsonData.labels) {
                  Console.WriteLine(label.id);
              }
          }
      
      }
      

      【讨论】:

        【解决方案4】:

        您的问题是您已将每个字典条目的ValueType 定义为object。 C# 不知道如何在对象上循环。因此,一旦JavaScriptSerializer 解析了 JSON,您就需要确定对象内部的实际类型。一种方法是

        var t = typeof(labels["labels"]);
        

        一旦您知道序列化程序正在创建什么类型,您所需要做的就是将对象转换回该类型。例如,假设它是一个对象列表

        var labels = (List<object>)labels["labels"];
        foreach (var label in labels)
        {
        }
        

        或者,如果 JSON 中的每个对象都相同,您可以尝试将字典创建为您需要的类型。所以你的序列化变成了

        var labels = new JavaScriptSerializer()
                         .Deserialize<Dictionary<string, List<object>>>(json); 
        

        【讨论】:

          【解决方案5】:

          你需要遍历你的字典。

              foreach(KeyValuePair<string, Object> entry in labels)
               {
                    // do something with entry.Value or entry.Key
               }
          

          一旦你开始循环访问它,你就可以访问键和值。由于您有兴趣查看 entry.value,您可以轻松地对其进行操作。目前您的字典值是没有枚举器的对象类型

          【讨论】:

          • 我尝试在循环中添加: if (entry.Key == "labels") { foreach (var l in entry.Value) { } 但我得到了同样的错误
          猜你喜欢
          • 2012-06-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-10-09
          • 1970-01-01
          • 2018-04-08
          • 1970-01-01
          相关资源
          最近更新 更多