【问题标题】:how to pass json array information to net core web api如何将json数组信息传递给net core web api
【发布时间】:2020-09-10 19:06:09
【问题描述】:

我正在用net core构建一个web api,我需要使用post方法来保存一个json文件的信息,缺点是json文件有一个数组,我不知道如何将信息发送到sql中的存储过程,以便它保存json文件的信息是这样的

"buyer": { // 
   "firstName": "fabio",
   "lastName": "gomez",
   "documentType": 0, // Puede ser 0: DNI, 1: Pasaporte o 2: Carnet de Extranjeria
   "documentNumber": "01234567", // Permitir letras para pasaportes extranjeros
   "phoneNumber": "51912345678",
   "email": "hnos@gmail.com"
 },
 "passengers": [{ // En el primer pasajero, pueden repetirse los datos del comprador
     "seat": 1,
     "firstName": "pedro",
     "lastName": "peres", // Considerar nueva campo 
     "secondLastName": "martinez",
     "documentType": 0, // Puede ser 0: DNI, 1: Pasaporte o 2: Carnet de Extranjeria
     "documentNumber": "15588",
     "age": 42,
     "gender": 0, // Puede ser 0: Masculino, 1: Femenino
   },
   {
     "seat": 2,
     "firstName": "Adriana",
     "lastName": "gomez",
     "secondLastName": "lopez",
     "documentType": 1, // Puede ser 0: DNI, 1: Pasaporte o 2: Carnet de Extranjeria
     "documentNumber": "XY01234567",
     "age": 40,
     "gender": 1, // Puede ser 0: Masculino, 1: Femenino
   }
 ],

这个json必须通过post进入系统,我使用如下驱动

[HttpPost]
  public async Task<IActionResult> Post([FromBody] List<string> valores)
        {
             await _repository.Insert(valores);
            return Ok();


        }

尝试使用 ado.net 做一些事情,但它不起作用

  public async Task Insert(List<string> parametros)
        {
            using (SqlConnection sql = new SqlConnection(_connectionString))
            {
                using (SqlCommand cmd = new SqlCommand("sp_insertarpasajero", sql))
                {
                    cmd.CommandType = System.Data.CommandType.StoredProcedure;
                    //cmd.Parameters.Add(new SqlParameter("@Id", parametros));

                    await sql.OpenAsync();
                    await cmd.ExecuteNonQueryAsync();
                    return;
                }
            }
        }

我不知道如何将接收帖子的控制器的信息传递给对象或数据表,然后在存储过程中使用它,感谢您的合作

【问题讨论】:

  • 在存储过程中创建一个负责接收数据表的类型,我没有设法将数据从列表传递到数据表

标签: .net-core asp.net-core-mvc asp.net-core-webapi


【解决方案1】:

对于你的 json 文件,你应该创建一个模型对象来接受 json 数据。以下是我的工作演示,你可以参考并在你的项目上进行修改:

模型

 public class Buyer
{
    public int Id { get; set; }

    public string FirstName { get; set; }
    public string LastName { get; set; }
    public int DocumentType { get; set; }
    public string DocumentNumber { get; set; }
    public string PhoneNumber { get; set; }

    public string Email { get; set; }
}
 public class Passenger
{
    public int Id { get; set; }
    public int Seat { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string SecondLastName { get; set; }
    public int DocumentType { get; set; }
    public string DocumentNumber { get; set; }
    public string Age { get; set; }

    public int Gender { get; set; }
}

 public class OrderInfo
{
    public Buyer Buyer { get; set; }
    public List<Passenger> Passengers { get; set; }
}

存储过程,使用OPENJSON (Transact-SQL)

CREATE PROCEDURE [dbo].[sp_insertpassenger]
  @json NVARCHAR(max)
AS
  INSERT INTO Passenger(
  Seat,FirstName,LastName,SecondLastName,
  DocumentType,DocumentNumber,Age,Gender)

  Select *
  FROM OPENJSON(@json ,'$.Passengers')
  WITH(
  Seat int '$.Seat',
  FirstName nvarchar(50) '$.FirstName',
  LastName nvarchar(50) '$.LastName',
  SecondLastName nvarchar(50) '$.SecondLastName',
  DocumentType int  '$.DocumentType',
  DocumentNumber nvarchar(50) '$.DocumentNumber',
  Age int '$.Age',
  Gender int '$.Gender' );
RETURN 0

控制器和存储库方法

[HttpPost]
    public async Task<IActionResult> Post([FromBody] OrderInfo values)
    {
        await _repository.Insert(values);
        return Ok();
    }

public async Task Insert(OrderInfo parameter)
    {

        using (SqlConnection sql = new SqlConnection(connectionString))
        {
            using (SqlCommand cmd = new SqlCommand("sp_insertpassenger", sql))
            {
                cmd.CommandType = System.Data.CommandType.StoredProcedure;

                var json = JsonConvert.SerializeObject(parameter);
                cmd.Parameters.Add(new SqlParameter("@json", json));

                await sql.OpenAsync();
                await cmd.ExecuteNonQueryAsync();
                return;
            }
        }
    }

结果

【讨论】:

    猜你喜欢
    • 2020-06-26
    • 2021-12-31
    • 2018-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多