首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >嵌套的JSON数据到数据表的动态C#

嵌套的JSON数据到数据表的动态C#
EN

Stack Overflow用户
提问于 2020-07-09 13:25:12
回答 1查看 1.1K关注 0票数 0
代码语言:javascript
运行
复制
{
    "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": []
        }
    ]
}

这是我从应用程序获得的JSON响应,还有许多其他API get返回相同类型的响应(嵌套),因此这必须动态完成,因为用户正在从配置文件添加API调用,所以我不能使用get和set创建预制的类。我的目标是将这些数据转换为数据表,以便在看到嵌套列时插入到数据库中,我的目标是使用"_“ex: category_id = "”或integrations_xero_basecurrency = "“等附加父列名称。

这是我用来将数据制表的代码,但在代码中,只有当列是JValue (键和值)时,它才会获取列,并且我无法创建一个合适的循环来完成此任务。

代码语言:javascript
运行
复制
    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;
    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-09 16:09:33

这样如何:

代码语言:javascript
运行
复制
public DataTable Tabulate(string jsonContent)
{
    var jsonLinq = JObject.Parse(jsonContent);

    // Find the first array using Linq
    var arrayProp = jsonLinq.Properties().First(p => p.Value is JArray);
    var srcArray = (JArray)arrayProp.Value;

    // Set up a regex consisting of the array property name and subscript 
    // (e.g. "projects[0]."), which we will strip off
    var regex = new Regex($@"^{arrayProp.Name}\[\d+\]\.");

    // Flatten each object of the original array 
    // into new objects and put them in a new array 
    var trgArray = new JArray(
        srcArray.Children<JObject>()
                .Select(row => new JObject(
                     row.Descendants()
                        .OfType<JProperty>()
                        .Where(p => p.Value is JValue)
                        .Select(p => new JProperty(
                            regex.Replace(p.Value.Path, "").Replace(".", "_"), 
                            p.Value
                        ))
                ))
        );

    // Convert the new array to a DataTable
    DataTable dt = trgArray.ToObject<DataTable>();

    return dt;
}

工作演示:https://dotnetfiddle.net/yrmcSQ

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62807964

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档