【问题标题】:C# Accessing data inside an objectC# 访问对象内部的数据
【发布时间】:2014-12-04 14:38:47
【问题描述】:

我有一个 JSON 对象,我已将其反序列化为服务器端的对象。其中一个对象是一个对象数组列表,每个对象是一个字符串字典,数组。在我的手表中,我可以深入查看对象并查看对象中的所有内容,但我无法弄清楚如何在代码中访问对象内部的数据。我需要遍历每个对象并访问字典中的键和值。 Rigor 对象是我想要深入研究的对象。

我已经硬编码了一个示例,说明输入的数据是什么样的。

    string rigorSelection = "{\"StandardID\":165638," + 
                        "\"ItemTypes\":[\"Multiple Choice\",\"True/False\",\"Constructed Response\",\"Explicit Constructed Response\",\"Select Dropdown\",\"Evidence Based Selected Response\",\"Drag and Drop\",\"Selectable Text\",\"Multi-Part\",\"Graphing\",\"Matching\"], " +
                        "\"TotalItemCount\":10," +
                        "\"StandardName\":\"CCSS.9_12.MA.N.RN.2\"," +
                        "\"Rigor\":[" +
                            "{\"Remembering\":[0,0,0,0,0,0,0,0,0,0,0]}," +
                            "{\"Understanding\":[0,0,0,0,0,0,0,0,0,0,0]}," +
                            "{\"Applying\":[0,0,0,0,0,0,0,0,0,0,0]}," +
                            "{\"Analyzing\":[0,0,0,0,0,0,0,0,0,0,0]}," +
                            "{\"Evaluating\":[0,0,0,0,0,0,0,0,0,0,0]}," +
                            "{\"Creating\":[0,0,0,0,0,0,0,0,0,0,0]}," +
                            "{\"Not Specified\":[0,0,0,0,0,0,0,0,0,0,0]}]" +
                        "}";

        System.Web.Script.Serialization.JavaScriptSerializer jSerializer =
           new System.Web.Script.Serialization.JavaScriptSerializer();
        AssessmentWCFVariables assessmentWCFVariable = jSerializer.Deserialize<AssessmentWCFVariables>(rigorSelection);

        var rigorCounts = assessmentWCFVariable.Rigor;   

数据被反序列化到的类是这个......

    [Serializable]
[DataContract]    
public class AssessmentWCFVariables
{
    [DataMember]
    public int StandardID { get; set; }

    [DataMember]
    public string StandardName { get; set; }

    [DataMember]
    public ArrayList ItemTypes { get; set; }

    [DataMember]
    public ArrayList Rigor { get; set; }

    [DataMember]
    public int TotalItemCount { get; set; }

}     

更新 rigorCounts 是对象的 ArrayList。我可以遍历每个对象,但是我尝试访问字典中的键/值对的所有内容都会给我一个错误。我正在尝试这样做。

    foreach (var rigor in rigorCounts)
        {
            var key = //code to get key of rigor i.e Remembering
            var value = //code to get the arrary i.e. [0,0,0,0,0,0,0,0,0,0,0]
        }  

【问题讨论】:

  • 您在访问该数据的哪个部分遇到问题?
  • 我已经尝试了您的代码,看起来它可以工作。究竟是什么问题?你能补充更多细节吗?
  • AssessmentWCFVariables.Rigor 成员的类型是什么?例如,如果你这样做,输出是什么? AssessmentWCFVariables awv = [Wherever this comes from]; object o = awv.Rigor[0]; System.Console.WriteLine((typeof o).ToString());
  • 我在你的代码中没有看到任何错误,你从哪里得到的?

标签: c# .net json serialization


【解决方案1】:

我需要遍历每个对象并访问字典中的键和值。

如果您考虑 Rigor 对象字典中的对象,则应将 Rigor 对象的类型更改为:

  [DataMember]
  public List<Dictionary<string, Int32[]>> Rigor { get; set; }

然后您可以使用以下代码轻松遍历 Rigor 对象中的每个字典:

var rigorCounts = assessmentWCFVariable.Rigor;

foreach (Dictionary<string, Int32[]> rigorCountDict in rigorCounts)
{
    foreach (KeyValuePair<string, Int32[]> kvpair in rigorCountDict)
    {
        string key = kvpair.Key; // e.g. "Remembering"
        Int32[] value = kvpair.Value; // e.g. [0,0,0,0,0,0,0,0,0,0,0]
    }
}

以防万一您无法将数据合同更改为字典列表,您可以在原始的 Rigor ArrayList 上执行以下操作:

foreach (Dictionary<string, object> rigorCountDict in rigorCounts)
{
    foreach (KeyValuePair<string, object> kvpair in rigorCountDict)
    {
        string key = kvpair.Key; // e.g. "Remembering"
        Int32[] value = (Int32[])((ArrayList)kvpair.Value).ToArray(typeof(Int32)); // e.g. [0,0,0,0,0,0,0,0,0,0,0]
    }
}

它没有第一个例子那么优雅,但它也很有效。

【讨论】:

  • 如果rigor 对象中的键是可变的(即有时可能有Remembering 键,有时没有,或者有时完全出乎意料),那么这绝对是正确的方法去做吧。如果它们是固定的,那么创建一个强类型对象可能会更干净。
【解决方案2】:

我同意单独的 Rigor 课程是最好的方法。但要回答您的具体问题:

foreach (var item in assessmentWCFVariable.Rigor)
{
   var dictionary = item as Dictionary<string, int[]>;

   if (dictionary == null) continue;

   // Do what you want with the dictionary here
}

可能需要对 AssesmentClass 进行以下更改:

[DataMember]
public IEnumerable<Dictionary<string, int[]> Rigor { get; set; }

【讨论】:

    【解决方案3】:

    您将ArrayList 用于Rigor。当您访问它(例如,通过索引)时,您将获得一个需要转换的对象,然后才能访问它的属性。为Rigor 对象创建一个类并使用List&lt;Rigor&gt; 可能会更好。比如:

    public class Rigor
    {
        public List<int> Remembering { get; set; }
        public List<int> Understanding {get; set; }
        // an so on for other properties...
    }
    

    然后将您的AssessmentWCFVariables 更改为:

    [DataMember]
    public List<Rigor> Rigor { get; set; }
    

    恕我直言:自从引入通用 List&lt;T&gt; 以来,使用 ArrayList 的理由为零

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-28
      • 2020-10-23
      • 2018-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多