#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