如何以嵌套数组而不是仅数组的形式将列表作为JSON对象返回?

问题描述

使用ASP.NET Core Web API框架,我的控制器返回一个列表,当前该列表以JSON格式将其输出格式化为纯数组。如何围绕该对象包装一个对象,使其输出为带有嵌套在其中的数组的对象?

我知道我可以通过创建一个新类来将该列表保存为属性来做到这一点,但是我想知道是否有一种更干净的方法可以执行此代码块(特别是因为仅使用该类)这种方法)。

我的控制器代码如下:

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

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

当前输出

[
  {
    "name": "Intranet 1","taskmanPath": "\\\\hostname\\syteline","reportPreviewUrl": "https://cname.domain.com/slreports","reportserverUrl": "http://hostname/reportserver_XYZ_TEST","masterSite": "DALS"
  },{
    "name": "Intranet 2","reportserverUrl": "http://fqdn/reportserver_XYZ_PILOT",]

所需的输出

{
  "Intranets": [
    {
      "name": "Intranet 1","masterSite": "DALS"
    },{
      "name": "Intranet 2","masterSite": "DALS"
    }
  ]
}

解决方法

如果将代码更改为以下形式:

public async Task<IActionResult> GetIntranets(string utilityServer,string configuration)
{
     List<Intranet> intranets = 
          await _intranetService.GetIntranets(utilityServer,configuration);
     
     var objectWrapper = new 
     {
        Intranets = intranets
     };     
     return new OkObjectResult(objectWrapper);
}

将创建一个匿名对象并将其序列化为您希望的样子。有一个关于以下事实的答案:出于类型安全性原因不应该使用匿名类型,但是无论如何,通过返回OkObjectResult都在处理对象类型,而这已经不考虑类型安全性。

您的问题中没有提到,但是如果您想知道如何反序列化,可以看一下以下示例:https://www.newtonsoft.com/json/help/html/DeserializeAnonymousType.htm