开发者社区 问答 正文

C#-需要帮助以生成带有SQL Server行中列名的JSON字符串

我正在用C#构建Web应用程序以生成JSON字符串。我有一个带有列的SQL Server表ID, Columnname, Parent ID, Value。

对于特定的ID,如果Id = parentId,则它是父列,而如果id!= parentid,则它是子项并具有父项。我将它们拉入数据表,从中我需要在标签中打印JSON字符串。

GetJSON表

Id   Columnname  ParentId   Value 
----------------------------------
 1   Parent1         1       100
 2   Parent2         2
 3   Child1          2       300
 4   Child2          2       400
输出JSON

{
    "Parent1" : "100",
    "Parent2" : {
                 "child1" : "300", 
                 "child2" : "400" 
    }
}

C#数据表

SqlCommand Fieldextract = new SqlCommand(Select * from GetJSON, sqlcon);
Dataset ds1 = new DataSet();
SqlDataAdapter = JSONInfoAdapter ;
JSONInfoAdapter = new SQLDataAdapter(FieldExtract);
JSONInfoAdapter.fill(ds1);
FieldExtract.Dispose();
JSONInfoAdapter = null;
DataTable JSONInfoTable = ds1.Table[0];

展开
收起
心有灵_夕 2019-12-22 14:02:52 795 分享 版权
阿里云 AI 助理回答

要实现这个需求,你可以使用递归方法来遍历数据表并构建JSON字符串。以下是一个简单的C#示例代码,展示了如何从你提供的数据表结构生成所需的JSON字符串:

using System;
using System.Data;
using Newtonsoft.Json.Linq;

public class Program
{
    public static void Main()
    {
        // 假设这是你从数据库获取的数据表
        DataTable JSONInfoTable = new DataTable();
        JSONInfoTable.Columns.Add("Id", typeof(int));
        JSONInfoTable.Columns.Add("Columnname", typeof(string));
        JSONInfoTable.Columns.Add("ParentId", typeof(int));
        JSONInfoTable.Columns.Add("Value", typeof(string));

        // 示例数据填充
        JSONInfoTable.Rows.Add(1, "Parent1", 1, "100");
        JSONInfoTable.Rows.Add(2, "Parent2", 2, "");
        JSONInfoTable.Rows.Add(3, "Child1", 2, "300");
        JSONInfoTable.Rows.Add(4, "Child2", 2, "400");

        // 调用方法生成JSON
        JObject json = BuildJson(JSONInfoTable);
        Console.WriteLine(json.ToString());
    }

    private static JObject BuildJson(DataTable dt)
    {
        JObject jsonObject = new JObject();

        foreach (DataRow row in dt.Rows)
        {
            int id = Convert.ToInt32(row["Id"]);
            string columnName = row["Columnname"].ToString();
            int parentId = Convert.ToInt32(row["ParentId"]);
            string value = row["Value"].ToString();

            if (parentId == id) // 父节点
            {
                jsonObject.Add(columnName, string.IsNullOrEmpty(value) ? new JObject() : JToken.FromObject(value));
            }
            else // 子节点
            {
                JObject parentJson;
                if (!jsonObject.TryGetValue(parentName, out JToken parentToken))
                {
                    parentJson = new JObject();
                    jsonObject.Add(parentName, parentJson);
                }
                else
                {
                    parentJson = (JObject)parentToken;
                }

                parentJson.Add(columnName, string.IsNullOrEmpty(value) ? new JObject() : JToken.FromObject(value));
            }
        }

        return jsonObject;
    }
}

这段代码首先定义了一个BuildJson方法,它接收一个DataTable作为输入,并通过遍历每一行来构建JSON对象。如果ParentId等于Id,则该行被视为父节点;否则,它被视为子节点,并被添加到相应的父节点下。

请注意,此代码使用了Newtonsoft.Json.Linq命名空间下的JObjectJToken类来构造JSON,因此你需要确保你的项目中已经引用了Newtonsoft.Json库。如果你的环境中没有这个库,可以通过NuGet包管理器安装它。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答