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

C# Custom Json using JSON.NET from dataset or datatable

谁能帮助我使用 C# 从数据表中获取自定义 JSON 字符串。

我需要类似 below.I 我能够通过使用 for each 循环来实现这一点。

[
    {"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();
        }                        

    }

您可以使用 Linq + DataTableExtensions (in namespace System.Data and system DLL System.Data.DataSetExtensions.dll) to transform your table into an enumerable of anonymous types, then serialize that to JSON with

我注意到你的 "userIds" 属性 是一个 JSON 数组。您想要合并给定警报的所有用户 userIds 吗?如果是这样,您可以使用 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);

以下table:

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