如何在WebAPI后端C#接收JSON数据?

29

如何在C#的WebAPI后端接收JSON数据?

我从JavaScript前端发送了以下JSON数据。

{
    "User_Id": 1,
    "TotalPrice": 35,
    "DeliveryAddress": "At my house",
    "CartItems": [
        {
            "Id": 1009,
            "Name": "Superman juni 2014",
            "Quantity": 1,
            "Price": 35
        }
    ]
}

我有这些类:

public class PurchaseOrder
    {        
        public List<CartItem> CartItems { get; set; }
        public string DeliveryAddress { get; set; }
        public int TotalPrice { get; set; }
        public int User_Id { get; set; }
    }
public class CartItem
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public int Quantity { get; set; }
        public int Price { get; set; }
    }

我的WebAPI方法:

[System.Web.Mvc.HttpPost]
        public bool AddOrder(PurchaseOrder order)
        {
            // Here I will do something

            return true;
        } 

当我使用“PurchaseOrder order”对象时,结果只会得到“null”。问题可能是我使用了[System.Web.Mvc.HttpPost]吗?我也尝试过[System.Web.Http.HttpPost],但结果相同。 // Martin


2
你在 JavaScript 请求中设置 Content-Type 为 application/json 吗? - Markus
1
你能包含完整的Javascript请求吗? - DavidG
创建一个名为order的JavaScript对象,并在传输时使用JSON.stringify进行格式化。 - Amit Kumar Ghosh
除非您正在使用vNext,否则这是错误的System.Web.Mvc.HttpPost,它应该来自Http命名空间,我认为不是Mvc。其次,这与您的JavaScript有关。 - Callum Linington
4个回答

19

您的请求的Content-Type应为"application/json"

如果您将json作为请求正文发送,则更改方法签名为

[HttpPost]
public bool AddOrder([FromBody] PurchaseOrder order)
{
}

contentType in javascript. - Amit Kumar Ghosh
[FromBody]可能不是必要的。 - Amit Kumar Ghosh
1
@AmitKumarGhosh 不,[FromBody] 绝对是必要的。默认情况下,WebApiController 实例会在 URL 中查找参数。如果您使用 JSON 字符串并将其发布,那么它必须在请求正文中查找。 - vapcguy

6
问题已解决,原因是缺少了“application/json”。以下是我的函数,希望能帮到其他遇到同样问题的人。我在使用 Knockout.js,因此有“self”这个单词。
self.makePurchase = function () {
            var tempUserId = self.orderUserId();
            var tempCartPrice = self.ShoppingCartPrice();
            var tempAddress = self.orderAddress();
            var tempCart = self.ShoppingCart();

            var orderSave = new PurchaseSave(tempUserId, tempCartPrice, tempAddress, tempCart);
            var myData = ko.toJSON(orderSave);
            console.log(myData);

            $.ajax({
                type: "POST",
                async: false,
                url: '/Products/AddOrder',
                contentType: "application/json", // Thank you Stackoverflow!!!
                dataType: "json",
                traditional: true,
                data: myData,
                error: function (xhr, textStatus, errorThrown) {
                    console.log(xhr.responseText);
                    console.log("Inside the error method");

                },
                success: function (data) {
                    console.log("Inside the success method");

                }
            });
        }

1
var self = this 是一个常见的操作,它让你知道你正在引用哪个 this。例如当你在 error: function () {} 内部时,这个 this 可能会发生变化。 - Callum Linington

3

1
对于WebApi,您应该使用此属性[System.Web.Http.HttpPost] - Callum Linington
@SaveendraEkanayake 看起来你和 Anton 同时回复了这个问题,只是在他之后 11 分钟提交了回复... 但基本上是一样的 - 至少你有一个链接。错过了 Content-Type 的部分... 但如果 OP 发布了他的 JavaScript,我相信你会注意到的。 :wink: - vapcguy

-4

尝试使用NuGet中的Newtonsoft.Json包。它们具有将任何字符串序列化和反序列化为Json的功能。 还可以尝试使用动态类型变量。这有助于反序列化。


6
这不是一个答案。 - Amit Kumar Ghosh
1
不是答案。 - Eric Wu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接