C#使用数据集或数据表中的JSON.NET自定义Json

时间:2015-12-14 16:51:18

标签: c# json post dataset json.net

有人可以帮助我使用C#从datatable获取自定义JSON字符串。

我需要类似下面的内容。我可以通过使用每个循环来实现这一点。

[
    {"message": {"alert": "Address Updated"},"target": {"userIds": ["BKAC7759"]}},
    {"message": {"alert": "Payment Processed"},"target": {"userIds": ["BKAC7759"]}},
    {"message": {"alert": "Notice Sent"},"target": {"userIds": ["BKAC7759"]}}
]

但是我有什么方法可以用简单的方式来做到这一点。我的数据表包含“alert”和“userIds”的值

    private string GetJsonData(int numberofRecords)
    {
        //  OleDbConnection conn = new OleDbConnection(connectionString);
        try
        {
            DataTable Test = new DataTable("A");
            Test.Columns.Add("alert");
            Test.Columns.Add("userIds");
            Test.Rows.Add("Address Updated", "BKAC7759");
            Test.Rows.Add("Payment Made", "BKAC7759");
            //Test.Rows.Add("Check Processed", "MAND1884");
            //Test.Rows.Add("Notice Mailed", "JAID3869");
            //Test.Rows.Add("DL Suspended", "AOQU4798");
            string jo = string.Empty;
            string com = ",";
            int i = 0;
            int count = Test.Rows.Count;
            string bracketright = "]";
            string bracketleft = "[";
            foreach (DataRow row in Test.Rows)
            {
                if (i == 0)
                {
                    jo = jo + bracketleft;
                }
                jo = jo + "{\"message\":{\"alert\":\"" + row[0].ToString() + "\"},\"target\":{\"userIds\":[\"" + row[1].ToString() + "\"]}}";
                if (i != count - 1)
                {
                    jo = jo + com;
                }
                else
                {
                    jo = jo + bracketright;
                }
                i++;
            }
            return jo;
        }
        catch (Exception ex)
        {
            Logger.Error("GetJsonData(int numberofRecords): " + ex.Message);                
            return string.Empty;
        }
        finally
        {
            // always close the connection.
           // conn.Close();
        }                        

    }

1 个答案:

答案 0 :(得分:1)

您可以使用Linq + DataTableExtensions(在命名空间System.Data和系统DLL System.Data.DataSetExtensions.dll中)将您的表转换为可枚举的anonymous types,然后将其序列化为JSON,

我注意到您的"userIds"属性是 JSON数组。您是否希望组合给定警报的所有用户userId?如果是这样,您可以使用ToLookup将它们组合在一起:

        var root = dataTable.AsEnumerable()
            .ToLookup(r => r["alert"].ToString(), r => r["userIds"].ToString())
            .Select(g => new { message = new { alert = g.Key }, target = new { userIds = g } });

        var json = JsonConvert.SerializeObject(root);

如果没有,请执行:

        var root = dataTable.AsEnumerable()
            .Select(r => new { message = new { alert = r["alert"].ToString() }, target = new { userIds = new [] { r["userIds"].ToString() } } });

        var json = JsonConvert.SerializeObject(root);

对于下表:

        var dataTable = new DataTable("A");
        dataTable.Columns.Add("alert");
        dataTable.Columns.Add("userIds");
        dataTable.Rows.Add("Address Updated", "BKAC7759");
        dataTable.Rows.Add("Payment Made", "BKAC7759");
        dataTable.Rows.Add("Address Updated", "MAND1884");
        dataTable.Rows.Add("Payment Made", "MAND1884");

第一个产生以下JSON:

[
    {"message":{"alert":"Address Updated"},"target":{"userIds":["BKAC7759","MAND1884"]}},
    {"message":{"alert":"Payment Made"},"target":{"userIds":["BKAC7759","MAND1884"]}}
]

第二个产生以下内容:

[
    {"message":{"alert":"Address Updated"},"target":{"userIds":["BKAC7759"]}},
    {"message":{"alert":"Payment Made"},"target":{"userIds":["BKAC7759"]}},
    {"message":{"alert":"Address Updated"},"target":{"userIds":["MAND1884"]}},
    {"message":{"alert":"Payment Made"},"target":{"userIds":["MAND1884"]}}
]