Возврат объекта как JSON данных с использованием веб-API C# - PullRequest
0 голосов
/ 03 августа 2020

Я хочу сгенерировать JSON данные из таблицы базы данных с помощью веб-API C#. Ниже приведена структура таблицы

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

Из этой таблицы, и я хочу сгенерировать JSON в следующем формате с использованием веб-API

{
  "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;
}

Я создал класс следующим образом

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 в следующем формате (с кругом массива, а не в желаемом формате, где отсутствует мудрая упаковка 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 Ответ

2 голосов
/ 03 августа 2020
  1. Измените тип возвращаемого значения вашего метода GetWorkflowFields с Task<Object> на Task<List<ConfiguredFields>>:

     public async Task<List<ConfiguredFields>> GetWorkflowFields(int WID)
     {
         ...
     }
    
  2. Измените свойства модели, чтобы иметь типы которые соответствуют данным в вашей базе данных (на основе определения таблицы, которое вы дали в своем вопросе).

    Измените 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; }
    }
    
  3. Измените метод контроллера GetFields, чтобы преобразовать результат из GetWorkflowFields в словарь:

     return _fieldService.GetWorkflowFields(id).Result.ToDictionary(f => f.fieldID);
    
  4. (Необязательно, но рекомендуется) Измените тип возвращаемого значения метода контроллера GetFields на 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);        
     }   
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...