es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo tener un tipo de campo dinámico dentro del payload json en un ApiController?

Necesito que una parte del esquema json sea variable. ¿Cómo declaro un campo que estará vinculado a la parte dinámica de un json?

Estoy utilizando net core 6.0 y el serializador Newtonsoft.

Ejemplo:

{
  "id": 1,
  ...
  "dynamicData": // a partir de aquí, el json puede tener cualquier estructura de json válida. El tipo es desconocido.
}

La clase de carga útil sería:

public class SomePayload {
   public int id {get;set;}
   public dynamic dynamicData {get;set;}
}

Usar el tipo dynamic coloca la parte del json dentro de un objeto dentro de otro objeto.

Esto significa que si envío esta carga útil:

{
  "id": 1,
  "dynamicData": {"x": 1}
}

La variable dynamicData obtendrá {"x": 1}.

Declarar dynamicData como una cadena y analizarla dentro del método del controlador debería funcionar, pero probablemente exista una forma más limpia de hacerlo que desconozco.
El tipo no tiene que ser el tipo dynamic.

Para mayor claridad, aquí está el controlador:

[ApiController]
[Route("[controller]")]
public class SomeController : ControllerBase
{
    [HttpPost]
    public void submit(SomePayload payload)
    {
    }            
}

Y el archivo program.cs para configurar NewtonsoftJson como el serializador de la API (las versiones anteriores a .NET Core 6 utilizan la clase Startup en su lugar):

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers()
.AddNewtonsoftJson();
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para declarar un campo que está vinculado a la parte dinámica de JSON, puedes utilizar la clase JObject del espacio de nombres Newtonsoft.Json.Linq en .NET Core.

    Aquí hay un ejemplo de clase de carga útil:

    public class MiCargaUtil {
        public int Id { get; set; }
        public JObject DatosDinamicos { get; set; }
    }
    

    Esta clase tiene una propiedad int llamada Id y una propiedad JObject llamada DatosDinamicos. El tipo JObject puede almacenar cualquier estructura JSON válida.

    Puedes utilizar esta clase en tu método del controlador de la siguiente manera:

    [HttpPost]
    public IActionResult MiAccionDelControlador([FromBody] MiCargaUtil cargaUtil) {
        // Hacer algo con cargaUtil.Id y cargaUtil.DatosDinamicos
    
        return Ok();
    }
    

    En este ejemplo, el atributo FromBody indica a ASP.NET Core que vincule los datos JSON entrantes a una instancia de la clase MiCargaUtil. La propiedad JObject llamada DatosDinamicos se llenará automáticamente con el objeto JSON que viene después del campo dynamicData.

    Vale la pena señalar que el tipo JObject es solo una de las muchas clases disponibles en el espacio de nombres Newtonsoft.Json.Linq. Dependiendo de la estructura específica de tu JSON entrante, es posible que desees utilizar una de las otras clases en su lugar.

Comments are closed.