C#访问对象内部的数据

C#访问对象内部的数据,c#,.net,json,serialization,C#,.net,Json,Serialization,我有一个JSON对象,我已将其反序列化为服务器端的一个对象。其中一个对象是对象的arraylist,每个对象都是字符串、数组的字典。在我的手表中,我可以深入查看对象,看到对象中的所有内容,但我不知道如何在代码中访问对象中的数据。我需要遍历每个对象并访问字典中的键和值。严格的目标就是我要深入研究的 我已经硬编码了一个数据输入的示例 string rigorSelection = "{\"StandardID\":165638," + "\"

我有一个JSON对象,我已将其反序列化为服务器端的一个对象。其中一个对象是对象的arraylist,每个对象都是字符串、数组的字典。在我的手表中,我可以深入查看对象,看到对象中的所有内容,但我不知道如何在代码中访问对象中的数据。我需要遍历每个对象并访问字典中的键和值。严格的目标就是我要深入研究的

我已经硬编码了一个数据输入的示例

    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;   
更新 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]
        }  

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

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
}
foreach(评估WCFvariable.Rigor中的var项目)
{
var dictionary=项目作为字典;
如果(dictionary==null)继续;
//你想用这本词典干什么就干什么
}
可能需要对AssessmentClass进行以下更改:

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

public IEnumerable您正在使用
ArrayList
进行
Rigor
。当您访问该对象(例如,通过索引)时,您将获得一个需要在访问其属性之前强制转换的对象。最好为
Rigor
对象创建一个类,并使用
列表
。比如:

public class Rigor
{
    public List<int> Remembering { get; set; }
    public List<int> Understanding {get; set; }
    // an so on for other properties...
}
IMHO:自从引入通用
列表以来,没有任何理由使用
ArrayList

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

如果你考虑严格对象字典中的对象,则不应该将严格对象的类型更改为:

  [DataMember]
  public List<Dictionary<string, Int32[]>> Rigor { get; set; }
[DataMember]
公共列表严格性{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]
    }
}
var rigorCounts=评估wcfvariable.Rigor;
foreach(字典rigorCounts中的rigorCountDict)
{
foreach(rigorCountDict中的KeyValuePair kvpair)
{
string key=kvpair.key;//例如“记住”
Int32[]value=kvpair.value;//例如[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]
    }
}
foreach(字典rigorCounts中的rigorCountDict)
{
foreach(rigorCountDict中的KeyValuePair kvpair)
{
string key=kvpair.key;//例如“记住”
Int32[]value=(Int32[])((ArrayList)kvpair.value).ToArray(typeof(Int32));//例如[0,0,0,0,0,0,0,0]
}
}

与第一个示例相比,它没有那么优雅,但也能正常工作。

在访问这些数据时,您遇到了哪些问题?我已经尝试了您的代码,看起来它能正常工作。到底是什么问题?您可以添加更多详细信息吗?评估WCFvariables的成员类型是什么?严格程度?例如,如果这样做,输出是什么<代码>评估WCFvariables awv=[无论来自何处];对象o=awv.Rigor[0];System.Console.WriteLine((typeof o.ToString())我没有看到您的代码中有任何错误,您是从哪里得到的?如果
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]
    }
}
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]
    }
}