Сопоставьте объект JSON с классом в параметре класса запроса API-функции Azure - PullRequest
0 голосов
/ 13 октября 2019

Сопоставление объекта JSON с классом c # свойство. Сценарий использования: я создаю API в функции Azure и передаю класс параметра-ReservationDraftRequestDto, как показано ниже: код

[FunctionName ("Function1")] публичный статический асинхронный запуск задачи ([HttpTrigger (AuthorizationLevel.Function, "get", "post", Route = null)] ReservationDraftRequestDtoservationDraftRequestDto , журнал ILogger) {}

Класс DTO:

API URI: http://localhost:7071/api/Function1 API вызова JSON-for: {"SoftHoldIDs": 444, "AppliedUsages": [{"SoftHoldID": 444, "UsageYearID": 4343, "DaysApplied": 0, "PointsApplied": 1}], "Гости": [1, 2]}

public class ReservationDraftRequestDto
{

    public int SoftHoldIDs { get; set; }
    public int[] Guests { get; set; }
    public AppliedUsage[] AppliedUsages { get; set; }

}


public class AppliedUsage
{
    public int SoftHoldID { get; set; }
    public int UsageYearID { get; set; }
    public int DaysApplied { get; set; }
    public int PointsApplied { get; set; }
}

Проблема заключается в том, что при вызове API с вышеуказанной полезной нагрузкой параметр класса API-ReservationDraftRequestD не сопоставляет значения массива AppliedUsages.

Пожалуйста, дайте мне знать, что мне нужно сделать, чтобы сопоставить полезную нагрузку API JSON с ReservationDraftRequestDto

Отправить запрос - enter image description here

Код: enter image description here

1 Ответ

0 голосов
/ 15 октября 2019

Это сделано специально. Логика привязки явно исключает массивы при десериализации содержимого тела json. Здесь можно сослаться на .

Если вы хотите получить объект, вотпростой обходной путь:

[FunctionName("Function1")]
public static async Task<IActionResult> Run(
    [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)]HttpRequest req,
    ILogger log)
{
    var reservationDraftRequestDto = req.DeserializeModel<ReservationDraftRequestDto>();

    var data = JsonConvert.SerializeObject(reservationDraftRequestDto);
    //more logic...
    return new OkResult();
}
public static T DeserializeModel<T>(this HttpRequest request)
{
    using (var reader = new StreamReader(request.Body))
    using (var textReader = new JsonTextReader(reader))
    {
        request.Body.Seek(0, SeekOrigin.Begin);
        var serializer = JsonSerializer.Create(new JsonSerializerSettings()
        {
            ContractResolver = new CamelCasePropertyNamesContractResolver()
        });
        return serializer.Deserialize<T>(textReader);
    }
}

Результат: enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...