简体   繁体   中英

C# Web API Nested JSON from Stored Procedure in MSSQL

Overview:

I'm building an API using ASP.NET Web API 2. I'm building Stored Procedures in SQL and linking these in the API to serve data.

I know that SQL can return JSON using FOR JSON AUTO , for example. But, I don't think it's the best place to configure the data and out put JSON . So I'm assuming there must be a way to achieve nested JSON in the API.

This is what I want to achieve:

    {
        "Apps": [
            {
                "ItemID": "1",
                "Path": "/AppReport",
                "Name": "AppReport",
                "Reports": [
                    {
                        "Reports_ItemID": "11",
                        "Reports_Path": "/AppReport/SubReport",
                        "Reports_Name": "SubReport"
                    },
                    {
                        "Reports_ItemID": "12",
                        "Reports_Path": "/AppReport/SubReport2",
                        "Reports_Name": "SubReport2"
                    }
                ]
            },
            {
                "ItemID": "2",
                "Path": "/AppReport2",
                "Name": "AppReport2",
                "Reports": [
                    {
                        "Reports_ItemID": "22",
                        "Reports_Path": "/AppReport/SubReport",
                        "Reports_Name": "SubReport"
                    }
                ]
            }
        ]
    }

At the moment it's coming out as a flat Array of Objects

    {
        "Apps": [
            {
                "ItemID": "1",
                "Path": "/AppReport",
                "Name": "AppReport",
                "Reports_ItemID": "11",
                "Reports_Path": "/AppReport/SubReport",
                "Reports_Name": "SubReport"
            },
            {
                "ItemID": "1",
                "Path": "/AppReport",
                "Name": "AppReport",
                "Reports_ItemID": "12",
                "Reports_Path": "/AppReport/SubReport2",
                "Reports_Name": "SubReport2"
            },

            ...
        ]
    }

I have a class of the Stored Procedure in the API that looks like this:

    namespace API.Stored_Procedures
    {
        public partial class SP_GetApps
        {
            public System.Guid ItemID { get; set; }
            public string Path { get; set; }
            public string Name { get; set; }
            public System.Guid Report_ItemID { get; set; }
            public string Report_Path { get; set; }
            public string Report_Name { get; set; }
        }

    }

My Controller looks like this:

    [HttpGet]
    [Route("{uid}", Name ="getReportApps")]
    [ResponseType(typeof(SP_GetApps_Result))]
    public IHttpActionResult SP_GetApps(string uid)
    {
        var res = db.Database.SqlQuery<SP_GetApps_Result>
            ("SP_GetApps {0}", uid);

        return Ok(res);
    }

In order to achieve the desired JSON Class should look like

public class App
{
    public string ItemID { get; set; }
    public string Path { get; set; }
    public string Name { get; set; }
    public List<Report> Reports { get; set; }
}

public class Report
{
    public string Reports_ItemID { get; set; }
    public string Reports_Path { get; set; }
    public string Reports_Name { get; set; }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM