Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将列表作为JSON对象返回,并使用嵌套数组而不仅仅是数组?_C#_Json_Asp.net Core Webapi - Fatal编程技术网

C# 如何将列表作为JSON对象返回,并使用嵌套数组而不仅仅是数组?

C# 如何将列表作为JSON对象返回,并使用嵌套数组而不仅仅是数组?,c#,json,asp.net-core-webapi,C#,Json,Asp.net Core Webapi,使用ASP.NET核心web API框架,我的控制器返回一个列表,该列表当前以JSON格式将其输出格式化为普通数组。如何将一个对象包装在其周围,使其作为一个嵌套有数组的对象输出 我知道我可以通过创建一个新类来保存这个列表作为属性来实现这一点,但是我想知道是否有一种更干净的方法可以实现这个代码块(特别是因为这个类只用于这个方法) 我的控制器代码如下: public async Task<IActionResult> GetIntranets(string utilityServer,

使用ASP.NET核心web API框架,我的控制器返回一个列表,该列表当前以JSON格式将其输出格式化为普通数组。如何将一个对象包装在其周围,使其作为一个嵌套有数组的对象输出

我知道我可以通过创建一个新类来保存这个列表作为属性来实现这一点,但是我想知道是否有一种更干净的方法可以实现这个代码块(特别是因为这个类只用于这个方法)

我的控制器代码如下:

public async Task<IActionResult> GetIntranets(string utilityServer,
     string configuration) {

     List<Intranet> intranets = 
          await _intranetService.GetIntranets(utilityServer, configuration);
            
     return new OkObjectResult(intranets);
}
期望输出:

{
  "Intranets": [
    {
      "name": "Intranet 1",
      "taskmanPath": "\\\\hostname\\syteline",
      "reportPreviewUrl": "https://cname.domain.com/slreports",
      "reportServerUrl": "http://hostname/ReportServer_XYZ_TEST",
      "masterSite": "DALS"
    },
    {
      "name": "Intranet 2",
      "taskmanPath": "\\\\hostname\\syteline",
      "reportPreviewUrl": "https://cname.domain.com/slreports",
      "reportServerUrl": "http://fqdn/ReportServer_XYZ_PILOT",
      "masterSite": "DALS"
    }
  ]
}

如果将代码更改为如下所示:

公共异步任务GetIntranet(字符串实用程序服务器,字符串配置)
{
列表内部网=
wait_intranetService.GetIntranets(实用服务器,配置);
var objectWrapper=new
{
内部网
};     
返回新的OkObjectResult(objectWrapper);
}
将创建一个匿名对象,并按您希望的方式对其进行序列化。有一个答案是,由于类型安全性,不应使用匿名类型,但通过返回OkObjectResult,您仍然在处理对象的类型,这已经忽略了类型安全性


您的问题中没有提到这一点,但如果您想知道如何对其进行反序列化,您可以看看这个很好的示例:

如果您将代码更改为如下所示:

公共异步任务GetIntranet(字符串实用程序服务器,字符串配置)
{
列表内部网=
wait_intranetService.GetIntranets(实用服务器,配置);
var objectWrapper=new
{
内部网
};     
返回新的OkObjectResult(objectWrapper);
}
将创建一个匿名对象,并按您希望的方式对其进行序列化。有一个答案是,由于类型安全性,不应使用匿名类型,但通过返回OkObjectResult,您仍然在处理对象的类型,这已经忽略了类型安全性


你的问题中没有提到这一点,但如果你想知道如何反序列化它,你可以看看这个好例子:

注意,这将输出
{“数据”:[]}
,而不是
{“内部网”:[]}
。我编辑了变量的名称,所以这是一个直接的答案,谢谢。@Tanveer Badar,顺便说一句,我没有足够的代表对你的答案发表评论,但我不相信你的第二个答案是可以编译的,元组不是至少需要两个元素吗?我现在已经删除了那篇文章,因为删除元组版本只会让它重新编写你的答案,而不会添加任何新内容。请注意,这将输出
{“Data”:[]}
而不是
{“内部网”:[]}
我编辑了变量的名称,所以这是一个直接的答案,谢谢。@Tanveer Badar,顺便说一句,我没有足够的代表对你的答案发表评论,但我不相信你的第二个答案编译好了,一个元组不需要最少两个元素吗?我现在已经删除了这篇文章,因为删除元组版本只会让它重新编写您的答案,而不会添加任何新内容。
{
  "Intranets": [
    {
      "name": "Intranet 1",
      "taskmanPath": "\\\\hostname\\syteline",
      "reportPreviewUrl": "https://cname.domain.com/slreports",
      "reportServerUrl": "http://hostname/ReportServer_XYZ_TEST",
      "masterSite": "DALS"
    },
    {
      "name": "Intranet 2",
      "taskmanPath": "\\\\hostname\\syteline",
      "reportPreviewUrl": "https://cname.domain.com/slreports",
      "reportServerUrl": "http://fqdn/ReportServer_XYZ_PILOT",
      "masterSite": "DALS"
    }
  ]
}