使用 Web API C# 将对象作为 JSON 数据返回

Returning object as JSON data using Web API C#

我想使用 Web API C# 从数据库 table 生成 JSON 数据。下面是table结构

CREATE TABLE [dbo].[Fields](
    [fieldID] [varchar](250) NOT NULL,
    [displayName] [varchar](500) NOT NULL,
    [id] [bigint] NOT NULL,
    [tenant] [bigint] NOT NULL,
    [Name] [varchar](500) NOT NULL,
    [description] [varchar](500) NULL,
    [type] [varchar](250) NULL
) ON [PRIMARY]
GO

并且有以下数据

INSERT [dbo].[Fields] ([fieldID], [displayName], [id], [tenant], [Name], [description], [type]) VALUES (N'100', N'Loan#', 18, 3, N'Loan#', N'Loan#', N'string')
GO
INSERT [dbo].[Fields] ([fieldID], [displayName], [id], [tenant], [Name], [description], [type]) VALUES (N'101', N'LoanProgram', 19, 3, N'LoanProgram', N'LoanProgram', N'string')
GO

从这个 table 中,我想使用 Web API

生成以下格式的 JSON
{
  "100": {
        "fieldID": "100",
        "displayName": "Loan#",
        "id": 18,
        "tenant": 3,
        "name": "Loan#",
        "description": "Loan#",
        "type": "string"        
    },
    "101": {
        "fieldID": "101",
        "displayName": "LoanProgram",
        "id": 19,
        "tenant": 3,
        "name": "LoanProgram",
        "description": "LoanProgram",
        "type": "string"        
    }
}

以下是我的API控制器

[HttpGet("Fields/{id}/fields/")]
public Object GetFields(int id)
{
   return _fieldService.GetFields(id).Result;
}

我创建了一个class如下

public class ConfiguredFields
{
    public int fieldID { get; set; }
    public string displayName { get; set; }
    public int id { get; set; }
    public string tenant { get; set; }
    public string name { get; set; }
    public string description { get; set; }
    public string type { get; set; }        
}

我使用 Dapper 调用了 SP 并尝试获取值

public async Task<Object> GetWorkflowFields(int WID)
{
    using (var db = new SqlConnection(_connectionString.Value))
    {
        var parameters = new DynamicParameters();
        parameters.Add("@pm_ID", WID);
        var result = await db.QueryAsync<ConfiguredFields>("SP_GetLoanFields", parameters, commandType: CommandType.StoredProcedure);

        
        return result.ToList();

    }
}

但我得到的 JSON 格式如下(使用数组 lap 而不是所需的格式,其中不存在 fieldID 明智的包装。)

[
    {
        "fieldID": 100,
        "displayName": "Loan#",
        "id": 18,
        "tenant": "3",
        "name": "Loan#",
        "description": "Loan#",
        "type": "string"        
    },
    {
        "fieldID": 101,
        "displayName": "LoanProgram",
        "id": 19,
        "tenant": "3",
        "name": "LoanProgram",
        "description": "LoanProgram",
        "type": "string"   
    }
    
]

请建议此处需要进行哪些更改才能获得所需格式的 JSON? 请帮我解决这个问题?

  1. GetWorkflowFields 方法的 return 类型从 Task<Object> 更改为 Task<List<ConfiguredFields>>:

     public async Task<List<ConfiguredFields>> GetWorkflowFields(int WID)
     {
         ...
     }
    
  2. 更改模型属性,使其类型与数据库中的数据匹配(基于您在问题中给出的 table 定义)。

    fieldIDint 更改为 string
    idint 更改为 long
    tenantstring 更改为 long

    public class ConfiguredFields
    {
        public string fieldID { get; set; }
        public string displayName { get; set; }
        public long id { get; set; }
        public long tenant { get; set; }
        public string name { get; set; }
        public string description { get; set; }
        public string type { get; set; }
    }
    
  3. 更改 GetFields 控制器方法以将结果从 GetWorkflowFields 转换为字典:

     return _fieldService.GetWorkflowFields(id).Result.ToDictionary(f => f.fieldID);
    
  4. (可选,但推荐)将 GetFields 控制器方法的 return 类型更改为 Dictionary<string, ConfiguredFields>。更好的是,使方法 async:

     [HttpGet("Fields/{id}/fields/")]
     public async Task<Dictionary<string, ConfiguredFields>> GetFields(int id)
     {
         var fields = await _fieldService.GetWorkflowFields(id);
         return fields.ToDictionary(f => f.fieldID);        
     }