Вложенный список JSON .NET - PullRequest
       7

Вложенный список JSON .NET

0 голосов
/ 21 февраля 2019

В настоящее время я пытаюсь принять запрос POST к конечной точке .NET Core Web API, который принимает следующую модель:

public class OrderPost
{
    [Required]
    public string DeliveryStreet { get; set; }

    public string DeliveryBuilding { get; set; }

    [Required]
    public string DeliveryCity { get; set; }

    [Required]
    public string DeliveryProvince { get; set; }

    [Required]
    public string DeliveryPostalCode { get; set; }

    [Required]
    public string CardName { get; set; }

    [Required]
    public string CardNumber { get; set; }

    [Required]
    public string CardExpiry { get; set; }

    [Required]
    public long CardCvv { get; set; }

    [Required]
    public List<OrderItem> OrderItems { get; set; }
}

public class OrderItem
{
    public long Id { get; set; }
    public string Category { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public Uri ImageUrl { get; set; }
    public long Price { get; set; }
    public DateTimeOffset CreatedAt { get; set; } 
    public DateTimeOffset UpdatedAt { get; set; }
    public long Quantity { get; set; }
}

Когда я удаляю List<OrderItem> и публикую данные безСписок звонков работает отлично.Как только я добавляю список обратно и пытаюсь POST данных, я получаю ошибку 400 Bad Request.У меня такое ощущение, что мне просто не хватает какого-то атрибута или чего-то в списке.JSON, который я публикую, действителен, я дважды проверил это.Любые идеи о том, что может быть причиной этого?

Вот JSON, который я POST'ing:

{
    "deliveryStreet": "Test street",
    "deliveryBuilding": "",
    "deliveryCity": "TEst",
    "deliveryProvince": "TEst",
    "deliveryPostalCode": "0852",
    "cardName": "Jane Jones",
    "cardNumber": "4711 1000 0000 0000",
    "cardExpiry": "05 / 20",
    "cardCvv": "123",
    "orderItems": [{
        "id": 1,
        "category": null,
        "name": "Test",
        "description": "Test test test",
        "imageUrl": "http://google.com/",
        "price": 625,
        "createdAt": "2019-02-21T13:25:56.709192",
        "updatedAt": "2019-02-21T13:25:56.709192",
        "quantity": 5
    }]
}

Вот конечная точка, которую я пытаюсь POST to:

[HttpPost]
public IActionResult Post([FromBody]OrderPost data)
{
        //Get the credit card type off of the number
        var type = StringUtilities.GetCardTypeFromNumber(data.CardNumber);
        //Check if valid type was found
        if (type == "UNKNOWN")
            return BadRequest("Unknown credit card type");

        float total = 0;
        .................
}

Ответы [ 2 ]

0 голосов
/ 22 февраля 2019

Для Asp.Net Core Web API ошибки проверки модели автоматически вызывают ответ HTTP 400, установите флажок Автоматические ответы HTTP 400 .

Попробуйте выполнить тест с кодом ниже:

services.AddMvc()
    .SetCompatibilityVersion(CompatibilityVersion.Version_2_2)
    .ConfigureApiBehaviorOptions(options =>
    {
        options.SuppressModelStateInvalidFilter = true;
    });
0 голосов
/ 21 февраля 2019

Как насчет отправки?

data: {
   deliveryObj: yourDeilveryObj,
   orderItems: yourOrderItemsArray
}

И ваш json объект должен выглядеть следующим образом:

{   
    "deliveryObj":      
        {   
            "deliveryStreet": "Test street",
            "deliveryBuilding": "",
            "deliveryCity": "TEst",
            "deliveryProvince": "TEst",
            "deliveryPostalCode": "0852",
            "cardName": "Jane Jones",
            "cardNumber": "4711 1000 0000 0000",
            "cardExpiry": "05 / 20",
            "cardCvv": "123",
        }, 

    "orderItems": [{
        "id": 1,
        "category": null,
        "name": "Test",
        "description": "Test test test",
        "imageUrl": "http://google.com/",
        "price": 625,
        "createdAt": "2019-02-21T13:25:56.709192",
        "updatedAt": "2019-02-21T13:25:56.709192",
        "quantity": 5
    }]
}

Теперь, на бэкэнде, вы должны получить его как JObject.

Ваш метод приема должен выглядеть следующим образом Post(JObject objData).Теперь вы можете разбить это objData до JObject и JArray.Это будет выглядеть примерно так:

[HttpPost]
public IHttpActionResult POST(JObject objData)
        {

            dynamic jsonData = objData;

            //DeliveryObj
            JObject deliveryObjJson = jsonData.deliveryObj;
            var deliveryObj= deliveryObjJson .ToObject<OrderPost>();

            //OrderItemsArray
            JArray orderItemsJson = jsonData.orderItems;
            var orderItems = orderItemsJson.Select(item => item.ToObject<OrderItem>()).ToList();



            return Ok(_services.Post(deliveryObj, orderItems ).Data);
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...