将JSON数据动态嵌套到datatable C#

将JSON数据动态嵌套到datatable C#,c#,json,datatable,json.net,C#,Json,Datatable,Json.net,这是我从一个应用程序得到的JSON响应,还有许多其他API GET返回相同类型的响应(嵌套),因此这必须在用户从配置文件添加API调用时动态完成,因此我无法使用GET和sets创建预先制作的类。 我的目标是将这些数据转换为要插入数据库的datatable 当我看到一个嵌套列时,我的目标是将父列名附加到该列上,并使用“\u”ex:category\u id=“” 或集成_xero_basecurrency=“”)等 这是我用来制表数据的代码,但在代码中,只有当列是JValue(键和值)时,它才会取

这是我从一个应用程序得到的JSON响应,还有许多其他API GET返回相同类型的响应(嵌套),因此这必须在用户从配置文件添加API调用时动态完成,因此我无法使用GET和sets创建预先制作的类。 我的目标是将这些数据转换为要插入数据库的datatable 当我看到一个嵌套列时,我的目标是将父列名附加到该列上,并使用“\u”ex:category\u id=“” 或集成_xero_basecurrency=“”)等

这是我用来制表数据的代码,但在代码中,只有当列是JValue(键和值)时,它才会取该列,我无法用我的一生来创建一个正确的循环来完成这个任务

{
    "STATUS": "OK",
    "projects": [
        {
            "startDate": "",
            "last-changed-on": "2019-01-03T11:46:14Z",
            "logo": "",
            "created-on": "2018-12-12T10:04:47Z",
            "privacyEnabled": false,
            "status": "active",
            "boardData": {},
            "replyByEmailEnabled": true,
            "harvest-timers-enabled": false,
            "description": "",
            "category": {
                "color": "",
                "id": "",
                "name": ""
            },
            "id": "322852",
            "overview-start-page": "default",
            "start-page": "projectoverview",
            "integrations": {
                "xero": {
                    "basecurrency": "",
                    "countrycode": "",
                    "enabled": false,
                    "connected": "NO",
                    "organisation": ""
                },
                "sharepoint": {
                    "account": "",
                    "foldername": "root",
                    "enabled": false,
                    "folder": "root"
                },
                "microsoftConnectors": {
                    "enabled": false
                },
                "onedrivebusiness": {
                    "account": "",
                    "foldername": "root",
                    "enabled": false,
                    "folder": "root"
                }
            },
            "defaults": {
                "privacy": ""
            },
            "notifyeveryone": false,
            "filesAutoNewVersion": false,
            "defaultPrivacy": "open",
            "tasks-start-page": "default",
            "starred": false,
            "announcementHTML": "",
            "isProjectAdmin": true,
            "name": "Project 2",
            "company": {
                "is-owner": "1",
                "id": "78494",
                "name": "MCG Company"
            },
            "endDate": "",
            "announcement": "",
            "show-announcement": false,
            "subStatus": "current",
            "tags": []
        },
        {
            "startDate": "",
            "last-changed-on": "2018-12-11T17:52:57Z",
            "logo": "",
            "created-on": "2018-11-26T11:11:00Z",
            "privacyEnabled": false,
            "status": "active",
            "boardData": {},
            "replyByEmailEnabled": true,
            "harvest-timers-enabled": false,
            "description": "",
            "category": {
                "color": "",
                "id": "",
                "name": ""
            },
            "id": "321041",
            "overview-start-page": "default",
            "portfolioBoards": [
                {
                    "card": {
                        "id": "4771"
                    },
                    "board": {
                        "id": "544",
                        "name": "Project Implementations",
                        "color": "#F39C12"
                    },
                    "column": {
                        "id": "1573",
                        "name": "Go Live",
                        "color": "#F1C40F"
                    }
                }
            ],
            "start-page": "projectoverview",
            "integrations": {
                "xero": {
                    "basecurrency": "",
                    "countrycode": "",
                    "enabled": false,
                    "connected": "NO",
                    "organisation": ""
                },
                "sharepoint": {
                    "account": "",
                    "foldername": "root",
                    "enabled": false,
                    "folder": "root"
                },
                "microsoftConnectors": {
                    "enabled": false
                },
                "onedrivebusiness": {
                    "account": "",
                    "foldername": "root",
                    "enabled": false,
                    "folder": "root"
                }
            },
            "defaults": {
                "privacy": ""
            },
            "notifyeveryone": false,
            "filesAutoNewVersion": false,
            "defaultPrivacy": "open",
            "tasks-start-page": "default",
            "starred": false,
            "announcementHTML": "",
            "isProjectAdmin": true,
            "name": "Project One",
            "company": {
                "is-owner": "1",
                "id": "78494",
                "name": "MCG Company"
            },
            "endDate": "",
            "announcement": "",
            "show-announcement": false,
            "subStatus": "current",
            "tags": []
        }
    ]
}
公共数据表表格(字符串jsonContent)
{
var jsonLinq=JObject.Parse(jsonContent);
//使用Linq查找第一个数组
var srcArray=jsonLinq.subjects(),其中(d=>d是JArray.First();
//Console.WriteLine(“extarcted数据:“+srcArray”);
var trgArray=new JArray();
foreach(srcArray.Children()中的JObject行)
{
var cleanRow=new JObject();
foreach(row.property()中的JProperty列)
{
//仅包括JValue类型
if(column.Value为JValue)
{
添加(column.Name、column.Value);
}
}
trgaray.Add(cleanRow);
}
DataTable dt=JsonConvert.DeserializeObject(trgaray.ToString());
返回dt;
}

像这样的东西怎么样:

    public DataTable Tabulate(string jsonContent)
    {
        var jsonLinq = JObject.Parse(jsonContent);

        // Find the first array using Linq
        var srcArray = jsonLinq.Descendants().Where(d => d is JArray).First();
        //Console.WriteLine("extarcted data:" + srcArray);
        var trgArray = new JArray();
        foreach (JObject row in srcArray.Children<JObject>())
        {
            var cleanRow = new JObject();
            foreach (JProperty column in row.Properties())
            {
                // Only include JValue types
                if (column.Value is JValue)
                {
                    cleanRow.Add(column.Name, column.Value);
                }
            }

            trgArray.Add(cleanRow);
        }

        DataTable dt = JsonConvert.DeserializeObject<DataTable>(trgArray.ToString());            

        return dt;
    }
公共数据表表格(字符串jsonContent)
{
var jsonLinq=JObject.Parse(jsonContent);
//使用Linq查找第一个数组
var arrayProp=jsonLinq.Properties().First(p=>p.Value为JArray);
var srcArray=(JArray)arrayProp.Value;
//设置由数组属性名和下标组成的正则表达式
//(例如,“项目[0]”),我们将删除这些项目
var regex=new regex($@“^{arrayProp.Name}\[\d+\]\.”);
//展平原始阵列的每个对象
//放入新对象并将其放入新数组中
var trgArray=新JArray(
srcArray.Children()
.选择(行=>new JObject(
行。后代()
第()类
其中(p=>p.Value为JValue)
.选择(p=>new JProperty(
regex.Replace(p.Value.Path,“”).Replace(“.”,“”),
p、 价值观
))
))
);
//将新数组转换为数据表
DataTable dt=trgaray.ToObject();
返回dt;
}

工作演示:

像这样的东西怎么样:

    public DataTable Tabulate(string jsonContent)
    {
        var jsonLinq = JObject.Parse(jsonContent);

        // Find the first array using Linq
        var srcArray = jsonLinq.Descendants().Where(d => d is JArray).First();
        //Console.WriteLine("extarcted data:" + srcArray);
        var trgArray = new JArray();
        foreach (JObject row in srcArray.Children<JObject>())
        {
            var cleanRow = new JObject();
            foreach (JProperty column in row.Properties())
            {
                // Only include JValue types
                if (column.Value is JValue)
                {
                    cleanRow.Add(column.Name, column.Value);
                }
            }

            trgArray.Add(cleanRow);
        }

        DataTable dt = JsonConvert.DeserializeObject<DataTable>(trgArray.ToString());            

        return dt;
    }
公共数据表表格(字符串jsonContent)
{
var jsonLinq=JObject.Parse(jsonContent);
//使用Linq查找第一个数组
var arrayProp=jsonLinq.Properties().First(p=>p.Value为JArray);
var srcArray=(JArray)arrayProp.Value;
//设置由数组属性名和下标组成的正则表达式
//(例如,“项目[0]”),我们将删除这些项目
var regex=new regex($@“^{arrayProp.Name}\[\d+\]\.”);
//展平原始阵列的每个对象
//放入新对象并将其放入新数组中
var trgArray=新JArray(
srcArray.Children()
.选择(行=>new JObject(
行。后代()
第()类
其中(p=>p.Value为JValue)
.选择(p=>new JProperty(
regex.Replace(p.Value.Path,“”).Replace(“.”,“”),
p、 价值观
))
))
);
//将新数组转换为数据表
DataTable dt=trgaray.ToObject();
返回dt;
}

工作演示:

它在大多数情况下都工作得很好,一些列是这样的,虽然portfolioBoards[0]\u board\u颜色为[0]和[1]我认为这是在没有数据的空列中发生的:“portfolioBoards”:[]我想知道您的JSON中是否有数组,如果是这样的话,你会想如何处理这些问题。您发布的示例没有
portfolioBoards
数组。请原谅我的无知,我是新手。你的问题是正确的,我没有考虑如何处理数组。正如我所看到的,我有两个选择,第一个是忽略它们(如果节点是数组类型,则忽略),或者像在列名中添加所有子节点一样处理它们,这会产生很多问题:列名太大,数组中的节点重复,等等。。我很想听听你的想法。。我已经在上面的示例中添加了portfolioBoards数组。忽略它们是最简单的选择,但这取决于您是否真正需要该数据。如果您确实需要它,那么您必须决定如何捕获它。一个想法是将子数据表存储在具有数组的列中。因此,例如,主列将是
portfolioBoards
,它将包含一个数据表,每行有
card\u id
board\u id
board\u name
board\u color
等列。但是,如果您的目标是将所有内容插入数据库,那么这将不会有任何帮助,因为您将无法在数据库中的表中存储表。它在大多数情况下工作得非常好,有些列是这样的,尽管portfolioBoards[0]\u board\u颜色带有[0]和[1]我认为这种情况适用于没有数据的空列“portfolioBoards”:[]我想知道您的JSON中是否有数组,如果有,您希望如何处理这些数组。您发布的示例没有
portfolioBoards
数组。请原谅我的无知,