Как создать своего рода динамическое поле внутри полезной нагрузки json на ApiController?

#web-services #.net-core #asp.net-web-api #json.net #asp.net-core-webapi

#веб-сервисы #.net-ядро #asp.net-веб-api #json.net #asp.net-ядро-webapi

Вопрос:

Мне нужно, чтобы часть json схемы была переменной. Как мне объявить поле, которое будет привязано к динамической части json?

Я использую net core 6.0 и Newtonsoft сериализатор.

Пример:

 {   id:1,  ...  dynamicData: //from here the json can be any valid json structure. the type is unknow. }  

Класс полезной нагрузки будет:

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

Используя dymanic тип, часть json помещается в объект внутри объекта. Это означает, что если я отправлю эту полезную нагрузку:

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

тот dynamicData получит {{"x":1}}

Объявление dynamicData строки и ее анализ внутри метода контроллера должны работать, но должен быть простой способ сделать это, о котором я не знаю. Тип не обязательно должен быть dynamic типом.

Для полноты картины, здесь контроллер:

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

и файл program.cs для установки NewtonsoftJson в качестве сериализатора api (версии .net core, предшествующие 6, вместо этого используют класс запуска):

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

Комментарии:

1. Вы хотите динамически изменять тип данных значения?

2. нет, потому что я не знаю этого типа во время проекта. Мне нужно иметь возможность получать расширенные данные в любом допустимом объекте struct json

Ответ №1:

Я сделал это, объявив свойство с помощью объекта типа и десериализуя его в модель, соответствующую формату динамических данных.

Динамическая модель

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

Модель для десериализации динамических данных

 public class modelThatMatchesDynamicData {    public int x {get;set;}  public string y {get;set;} }  

Тело запроса

 {  "id": 20,  "dynamicData": {  "x": 47,  "y": "string"  } }  

Десертизация

 [ApiController] [Route("[controller]")] public class SomeController : ControllerBase {  [HttpPost]  public void submit(SomePayload payload)  {  var variable = JsonConvert.DeserializeObjectlt;modelThatMatchesDynamicDatagt;(JsonConvert.SerializeObject(payload));  }  }  

Это работает для вас?

Комментарии:

1. Это не очень динамично, потому что для этого требуется предыдущий класс модели know