【问题标题】:Loop through JSON Results using JSON.NET使用 JSON.NET 循环遍历 JSON 结果
【发布时间】:2015-11-30 15:41:56
【问题描述】:

我有以下有效的 JSON,我需要遍历结果。我正在使用 JSON.NET 和 c#。我能够获得成功的价值,但我不知道如何访问任何指导都会有所帮助。

{
    "SUCCESS": 1,
    "ERRMSG": "",
    "COLUMNSANDDATA": {
        "COLUMNS": ["LASTNAME", "FIRSTNAME", "EMAILADDRESS", "COURSENAME", "PROGRAMID", 
                    "ENROLLMENTSTARTDATE", "COMPLETIONDATE", "GRADE", "SCORE", 
                    "PASSED_NOTPASSED", "TYPEOFCREDITS", "CREDITSEARNED", "INSTRUCTORNAME",
                    "INSTRUCTOREMAILADDRESS", "CLIENTNAME", "COMMUNITYNAME", 
                    "CERTIFICATESENTDATE", "DURATIONTYPE", "DURATIONMINUTES", 
                    "LOGIN"],
        "DATA": [
            ["Beane", "Coffee", "lynn@domain.com", "Program with One Essay Test", null, 
             "January, 06 2014 18:06:56", "January, 06 2014 18:57:53", "Incomplete", null, 
             "Not Passed", "Musical Note", 0.00, "Ray Bradbury", "lynn@domain.com", 
             "Hogarth's Flying Circus", "Captain's Club", null, null, null, 
             "lynn@domain.com"],
            ["Beane", "Navy", "lynn@domain.com", "Program with One Essay Test", null, 
             "January, 06 2014 18:06:56", "January, 06 2014 18:36:39", "Pass", 95.00, 
             "Passed", "Musical Note", 1.00, "Ray Bradbury", "lynn@domain.com", 
             "Hogarth's Flying Circus", "Captain's Club", "January, 06 2014 08:00:00", 
             null, null, "NavyB"]
        ]
    }
}

我可以通过使用这个代码块获得成功值

using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
{
    var result = streamReader.ReadToEnd();

    var deserializer = new JavaScriptSerializer();
    var jsonObj = (IDictionary<string, object>)deserializer.DeserializeObject(result); ;

    Response.Write((string)jsonObj["SUCCESS"]);
}

【问题讨论】:

  • 你确定你使用的是Json.Net吗? JavaScriptSerializer 是 Microsoft 提供的类(不是 Json.Net 的一部分)。
  • 是的。我安装了 JSON.NET,因为我看过的很多示例都使用它。该项目最初是使用 MS 提供的类库创建的。

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


【解决方案1】:

这样的东西应该可以工作,抱歉,它没有经过测试。

JArray data_list = (JArray)jsonObj["COLUMNSANDDATA"]["DATA"];

foreach (JObject data in data_list) {
    string col_0 = (string)data[0];
}

【讨论】:

  • "无法将 [] 索引应用于“对象”类型的表达式,但我明白您正在尝试做什么,因为我只需要一两个值,这就是我要去的路线追求。
【解决方案2】:
  1. Cenerate class
  2. 反序列化为此类的实例

public class COLUMNSANDDATA
{
    public List<string> COLUMNS { get; set; }
    public List<List<object>> DATA { get; set; }
}

public class RootObject
{
    public int SUCCESS { get; set; }
    public string ERRMSG { get; set; }
    public COLUMNSANDDATA COLUMNSANDDATA { get; set; }
}


var deserializer = new JavaScriptSerializer();
var jsonObj = deserializer.DeserializeObject<RootObject>(result);

foreach(col in jsonObj.COLUMNSANDDATA.COLUMNS)
{
    //...
}

【讨论】:

  • 如果用户只想要每个项目的单个属性,这真的有必要吗?想象一下,如果 JSON 更大......
  • @Umair 这取决于。我不知道所有要求。所以,我只展示一种方法,它是如何解决的。当然,在很多情况下我的答案是不好的,但也有很多情况是好的。在这里,我认为,它已经足够好了
【解决方案3】:

我强烈建议您使用自动生成的类来最舒适地导航和使用这些类。

看这篇文章How to auto-generate a C# class file from a JSON object string 它将帮助您通过自动生成classe form json和xml。顺便说一句,它会在未来帮助你。

var deserializer = new JavaScriptSerializer(); var jsonObj = deserializer.DeserializeObject<RootObject>(result);

【讨论】:

    【解决方案4】:

    您可以像这样遍历 JSON 并转储所有内容:

    string json = @"
    {
        ""SUCCESS"": 1,
        ""ERRMSG"": """",
        ""COLUMNSANDDATA"": {
            ""COLUMNS"": [""LASTNAME"", ""FIRSTNAME"", ""EMAILADDRESS"", ""COURSENAME"", ""PROGRAMID"", ""ENROLLMENTSTARTDATE"", ""COMPLETIONDATE"", ""GRADE"", ""SCORE"", ""PASSED_NOTPASSED"", ""TYPEOFCREDITS"", ""CREDITSEARNED"", ""INSTRUCTORNAME"", ""INSTRUCTOREMAILADDRESS"", ""CLIENTNAME"", ""COMMUNITYNAME"", ""CERTIFICATESENTDATE"", ""DURATIONTYPE"", ""DURATIONMINUTES"", ""LOGIN""],
            ""DATA"": [
                [""Beane"", ""Coffee"", ""lynn@domain.com"", ""Program with One Essay Test"", null, ""January, 06 2014 18:06:56"", ""January, 06 2014 18:57:53"", ""Incomplete"", null, ""Not Passed"", ""Musical Note"", 0.00, ""Ray Bradbury"", ""lynn@domain.com"", ""Hogarth's Flying Circus"", ""Captain's Club"", null, null, null, ""lynn@domain.com""],
                [""Beane"", ""Navy"", ""lynn@domain.com"", ""Program with One Essay Test"", null, ""January, 06 2014 18:06:56"", ""January, 06 2014 18:36:39"", ""Pass"", 95.00, ""Passed"", ""Musical Note"", 1.00, ""Ray Bradbury"", ""lynn@domain.com"", ""Hogarth's Flying Circus"", ""Captain's Club"", ""January, 06 2014 08:00:00"", null, null, ""NavyB""]
            ]
        }
    }";
    
    JObject root = JObject.Parse(json);
    JObject colsAndData = (JObject)root["COLUMNSANDDATA"];
    JArray cols = (JArray)colsAndData["COLUMNS"];
    foreach (JArray row in colsAndData["DATA"])
    {
        for (int i = 0; i < row.Count; i++)
        {
            string colName = (string)cols[i];
            string value = (string)row[i];
            Console.WriteLine(colName + ": " + value);
        }
        Console.WriteLine();
    }
    

    输出:

    LASTNAME: Beane
    FIRSTNAME: Coffee
    EMAILADDRESS: lynn@domain.com
    COURSENAME: Program with One Essay Test
    PROGRAMID:
    ENROLLMENTSTARTDATE: January, 06 2014 18:06:56
    COMPLETIONDATE: January, 06 2014 18:57:53
    GRADE: Incomplete
    SCORE:
    PASSED_NOTPASSED: Not Passed
    TYPEOFCREDITS: Musical Note
    CREDITSEARNED: 0
    INSTRUCTORNAME: Ray Bradbury
    INSTRUCTOREMAILADDRESS: lynn@domain.com
    CLIENTNAME: Hogarth's Flying Circus
    COMMUNITYNAME: Captain's Club
    CERTIFICATESENTDATE:
    DURATIONTYPE:
    DURATIONMINUTES:
    LOGIN: lynn@domain.com
    
    LASTNAME: Beane
    FIRSTNAME: Navy
    EMAILADDRESS: lynn@domain.com
    COURSENAME: Program with One Essay Test
    PROGRAMID:
    ENROLLMENTSTARTDATE: January, 06 2014 18:06:56
    COMPLETIONDATE: January, 06 2014 18:36:39
    GRADE: Pass
    SCORE: 95
    PASSED_NOTPASSED: Passed
    TYPEOFCREDITS: Musical Note
    CREDITSEARNED: 1
    INSTRUCTORNAME: Ray Bradbury
    INSTRUCTOREMAILADDRESS: lynn@domain.com
    CLIENTNAME: Hogarth's Flying Circus
    COMMUNITYNAME: Captain's Club
    CERTIFICATESENTDATE: January, 06 2014 08:00:00
    DURATIONTYPE:
    DURATIONMINUTES:
    LOGIN: NavyB
    

    小提琴:https://dotnetfiddle.net/B7bMEe

    【讨论】:

      猜你喜欢
      • 2011-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-05
      • 2013-09-14
      • 2019-02-18
      • 1970-01-01
      相关资源
      最近更新 更多