【问题标题】:Nested list JSON .NET嵌套列表 JSON .NET
【发布时间】:2019-02-21 14:36:19
【问题描述】:

我目前正在尝试接受对接受以下模型的 .NET Core Web API 端点的 POST 请求:

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&lt;OrderItem&gt; 并在没有 List 的情况下发布数据时,调用工作完美。一旦我将列表添加回来并尝试POST 数据,我就会收到400 Bad Request 错误。我有一种感觉,我只是缺少列表中的某些属性或某些东西。我发布的 JSON 是有效的,我仔细检查了。关于可能导致此问题的任何想法?

这是我要发布的 JSON:

{
    "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 的端点:

[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;
        .................
}

【问题讨论】:

  • 你的服务器日志说什么?您应该能够找到一些关于为什么触发 400 的信息。
  • 400 表示 请求 错误。它与 JSON 序列化无关。您尚未发布任何服务器端代码或请求示例,甚至 JSON 字符串示例,因此无法提供帮助。检查 Web 服务器的日志,使用浏览器的开发工具或调试代理(如 Fiddler)查看实际发送到服务器的内容。
  • @Tachyon 您是否尝试过调试该代码?发生了什么?输出窗口说什么?
  • @Tachyon 再次检查您的浏览器日志并使用 Fiddler 查看发送的内容。 400 表示请求从未进入操作。服务器本身将其作为错误请求拒绝。也许内容类型是错误的?您是如何提出请求的?
  • @PanagiotisKanavos 或发出请求:return BadRequest("Unknown credit card type"); 或发出请求,但新的 ASP.NET Core WebAPI 属性完成的 ModelState 验证不成功

标签: c# asp.net-core json.net


【解决方案1】:

你送呢?

data: {
   deliveryObj: yourDeilveryObj,
   orderItems: yourOrderItemsArray
}

你的json obj 应该如下所示:

{   
    "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 分解为JObjectJArray。 它看起来像:

[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);
        }

【讨论】:

    【解决方案2】:

    对于 Asp.Net Core Web api,模型验证错误会自动触发 HTTP 400 响应,请查看 Automatic HTTP 400 responses

    尝试使用以下代码进行测试:

    services.AddMvc()
        .SetCompatibilityVersion(CompatibilityVersion.Version_2_2)
        .ConfigureApiBehaviorOptions(options =>
        {
            options.SuppressModelStateInvalidFilter = true;
        });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-25
      • 1970-01-01
      相关资源
      最近更新 更多