使用 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?
请帮我解决这个问题?
将 GetWorkflowFields
方法的 return 类型从 Task<Object>
更改为 Task<List<ConfiguredFields>>
:
public async Task<List<ConfiguredFields>> GetWorkflowFields(int WID)
{
...
}
更改模型属性,使其类型与数据库中的数据匹配(基于您在问题中给出的 table 定义)。
将 fieldID
从 int
更改为 string
。
将 id
从 int
更改为 long
。
将 tenant
从 string
更改为 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; }
}
更改 GetFields
控制器方法以将结果从 GetWorkflowFields
转换为字典:
return _fieldService.GetWorkflowFields(id).Result.ToDictionary(f => f.fieldID);
(可选,但推荐)将 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);
}
我想使用 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? 请帮我解决这个问题?
将
GetWorkflowFields
方法的 return 类型从Task<Object>
更改为Task<List<ConfiguredFields>>
:public async Task<List<ConfiguredFields>> GetWorkflowFields(int WID) { ... }
更改模型属性,使其类型与数据库中的数据匹配(基于您在问题中给出的 table 定义)。
将
fieldID
从int
更改为string
。
将id
从int
更改为long
。
将tenant
从string
更改为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; } }
更改
GetFields
控制器方法以将结果从GetWorkflowFields
转换为字典:return _fieldService.GetWorkflowFields(id).Result.ToDictionary(f => f.fieldID);
(可选,但推荐)将
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); }