C# DataTable到c中的嵌套json

C# DataTable到c中的嵌套json,c#,asp.net,json,datatable,javascriptserializer,C#,Asp.net,Json,Datatable,Javascriptserializer,我想将DataTable转换为嵌套JSON。我有一个表格公告,上面有列名类别、标题、详细信息、简短描述、作者和显示日期 Datatabel结果如下所示: Category Headline Details Short_desc Author Display_date Sports H1 d1 sd1 a1 dd1 Sports h2 d2

我想将DataTable转换为嵌套JSON。我有一个表格公告,上面有列名类别、标题、详细信息、简短描述、作者和显示日期

Datatabel结果如下所示:

Category     Headline    Details     Short_desc  Author   Display_date 

Sports       H1          d1          sd1          a1        dd1
Sports       h2          d2          sd2          a2        dd2
Technology   t1          d3          sd3          a3        dd3
Technology   t2          d4          sd4          a4        dd4
   {   
      "Sports" : [ 
            "Headline":"H1",
            "Details":"d1",
            "Short_desc":"sd1",
            "Author":"a1",
            "Display_date":"dd1"
          ],
       "Sports" :[ 
            "Headline":"H2",
            "Details":"d2",
            "Short_desc":"sd2",
            "Author":"a2",
            "Display_date":"dd2"
          ] ....
        }
现在我希望JSON结果类似于:

{   
  "Sports" : [ [ 
        "Headline":"H1",
        "Details":"d1",
        "Short_desc":"sd1",
        "Author":"a1",
        "Display_date":"dd1"
      ],
      [ "Headline":"H2",
        "Details":"d2",
        "Short_desc":"sd2",
        "Author":"a2",
        "Display_date":"dd2"
      ]
    ],
  "Technology" : [ [ 
        "Headline":"t1",
        "Details":"d3",
        "Short_desc":"sd3",
        "Author":"a3",
        "Display_date":"dd3"
      ],
      [ "Headline":"t4",
        "Details":"d4",
        "Short_desc":"sd4",
        "Author":"a4",
        "Display_date":"dd4"
      ]
    ]
}
我使用了以下代码:

DataTable dts = get_banner_detail_service("");

System.Web.Script.Serialization.JavaScriptSerializer serializer = 
    new System.Web.Script.Serialization.JavaScriptSerializer();
List<Dictionary<string, object>> rows = new List<Dictionary<string, object>>();
Dictionary<string, object> row;
foreach (DataRow dr in dts.Rows)
{
    row = new Dictionary<string, object>();
    foreach (DataColumn col in dts.Columns)
    {
        row.Add(col.ColumnName, dr[col]);
    }
    rows.Add(row);
}
Response.Write(serializer.Serialize(rows));
Response.Flush();
Response.End();

您需要创建嵌套字典,如下所示:

        Dictionary<string, Dictionary<string, object>> rows = new Dictionary<string, Dictionary<string, object>>();
        Dictionary<string, object> row;
        foreach (DataRow dr in dts.Rows)
        {
            row = new Dictionary<string, object>();
            var columns = dts.Columns;

            for (int i = 1; i < columns.Count; i++)
            {
                row.Add(columns[i].ColumnName, dr[columns[i]]);
            }

            if (rows.ContainsKey(columns[0].ColumnName))
                rows[columns[0].ColumnName] = rows[columns[0].ColumnName].Concat(row).ToDictionary(p=>p.Key,v=>v.Value);
            else
                rows[columns[0].ColumnName] = row;

        }

嗨,我终于解决了这个问题。。。 下面是更新的代码-

DataTable dts = get_banner_detail_service("");
        DataTable dtc = get_banner_detail_cat("");
        List<Dictionary<string, object>> rows = new List<Dictionary<string, object>>();
        Dictionary<string, object> rowss;
        Dictionary<string, object> rowsc;
        List<object> rowsin;
        System.Web.Script.Serialization.JavaScriptSerializer serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
        rowsc = new Dictionary<string, object>();
        foreach (DataRow dr in dtc.Rows)
        {
            string cat = dr["Category"].ToString();

            var filteredAndroid = (from n in dts.AsEnumerable()
                                   where n.Field<string>("Category").Contains(cat)
                                   select n).ToList();

            if (filteredAndroid.Count != 0)
            {
                DataTable t = filteredAndroid.CopyToDataTable();

                t.Columns.Remove("Category");
                rowss = new Dictionary<string, object>();

                rowsin = new List<object>();
                foreach (DataRow drr in t.Rows)
                {
                    foreach (DataColumn col in t.Columns)
                    {
                        rowss.Add(col.ColumnName, drr[col]);
                    }
                    rowsin.Add(rowss);
                    rowss = new Dictionary<string, object>();

                }
                rowsc.Add(cat, rowsin);
                t.Dispose();
                t = null;
                filteredAndroid = null;
            }
        }
        rows.Add(rowsc);

        string json = JsonConvert.SerializeObject(rows, Newtonsoft.Json.Formatting.Indented);
        if (json.Length > 2)
        {
            json = json.Substring(1, json.Length - 2);
        }
        Response.Write(json);
        Response.Flush();
        Response.End();

有什么问题?你能解释一下吗?它会崩溃吗?或者输出不符合预期?是的,输出不符合我真正想要的。它返回类别明智的resultThanks for reply,但如果已添加具有相同键的项,则会发生参数异常。