2014-12-04 83 views
1

我有一个JSON对象,我已经反序列化到服务器端的对象。其中一个对象是对象的数组列表,每个对象都是一个字符串数组的字典。在我的观察中,我可以深入了解对象并查看对象中的所有内容,但我无法弄清楚如何访问代码中对象内的数据。我需要遍历每个对象并访问字典中的键和值。 Rigor对象就是我正在努力钻研的内容。C#访问对象内的数据

我已经硬编码什么样的数据看起来像在未来的一个例子。

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; } 

}  

UPDATE 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] 
     } 
+1

访问该数据的哪个部分是您遇到的问题? – 2014-12-04 14:44:27

+1

我试过你的代码,看起来像是有效的。究竟是什么问题?你能添加更多细节吗? – 2014-12-04 14:44:55

+2

AssessmentWCFVariables.Rigor成员的类型是什么? 例如,如果你这样做,输出是什么? 'AssessmentWCFVariables awv = [无论哪里来自]; object o = awv.Rigor [0]; System.Console.WriteLine((typeof o).ToString());' – 2014-12-04 14:46:06

回答

1

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

如果您考虑在严密对象字典中的对象应该比你改变你的严谨性对象的类型:

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

然后你可以通过严谨的对象每个字典有以下容易循环代码:

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] 
    } 
} 

万一你没有改变你的数据合同词典列表的奢侈,你可以做原来的严谨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] 
    } 
} 

它比第一个例子不那么优雅,但它也可以。

+0

如果'rigor'对象中的键是可变的(即有时候可能有'Remembering'键,有时候不是,有时甚至是完全意想不到的),那么这是绝对正确的方法。如果它们是固定的,那么创建一个强类型对象可能更干净。 – 2014-12-04 14:52:51

1

我同意一个单独的Rigor类是最好的办法。

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

您使用的是ArrayListRigor:但是,为了回答您的具体问题:

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作出。当你访问它(例如,通过索引)时,你会得到一个需要被转换的对象,然后才能访问它的属性。创建一个Rigor对象的类并使用List<Rigor>可能会更好。喜欢的东西:

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; } 

恕我直言:有零理由用不完ArrayList以来引进的通用List<T>