如何在 WebAPI 后端 C# 上接收 JSON 数据?
Posted
技术标签:
【中文标题】如何在 WebAPI 后端 C# 上接收 JSON 数据?【英文标题】:How to receive JSON data on WebAPI backend C#? 【发布时间】:2015-09-10 10:13:35 【问题描述】:如何在 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],但得到了相同的结果。 // 马丁
【问题讨论】:
您是否在 JavaScript 请求中将 Content-Type 设置为application/json
?
你能包含完整的 Javascript 请求吗?
使用您的数据构建一个名为 order
的 javascript 对象,并在发布时使用 JSON.stringify
。
除非您使用 vNext,否则这是错误的 System.Web.Mvc.HttpPost
它应该来自 Http
命名空间我相信不是 Mvc
一个。其次,这与您的 JavaScript 有关。
【参考方案1】:
您请求的Content-Type
应为"application/json"
如果您在请求正文中发布您的 json,则将方法签名更改为
[HttpPost]
public bool AddOrder([FromBody] PurchaseOrder order)
【讨论】:
contentType
在javascript中。
[FromBody]
可能不是必需的。
@AmitKumarGhosh 不,[FromBody]
肯定是必要的。默认情况下,WebApiController 实例在 URL 中查找参数。如果您使用的是 JSON 字符串并发布它,则它必须查看请求正文。【参考方案2】:
问题解决了,缺少的是“应用程序/json”。对于其他有同样问题的人,这是我的功能。我正在使用 Knockout.js,因此是“自我”一词。
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 ***!!!
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");
);
【讨论】:
var self = this
是很常见的事情,让我们知道您所指的 this
是什么,因为当您在里面说 error: function ()
时,这可能会发生变化。【参考方案3】:
将您的实现更改为此。
[System.Web.Http.HttpPost]
public bool AddOrder([FromBody] PurchaseOrder order)
更多详情-http://www.asp.net/web-api/overview/getting-started-with-aspnet-web-api/tutorial-your-first-web-api
【讨论】:
对于WebApi,你应该使用这个属性[System.Web.Http.HttpPost]
@SaveendraEkanayake 看起来您与 Anton 在同一时间输入了此回复,并且在他完成后 11 分钟才提交...但这基本上是一样的——至少您有一个链接。错过了关于 Content-Type 的部分.. 但是 OP 没有发布他的 JavaScript 并没有帮助 - 如果他有,我相信你会抓住这一点。 :wink:【参考方案4】:
尝试使用来自 NuGet 的 Newtonsoft.Json 包。它们具有将任何字符串序列化和反序列化为 Json 的功能。 也尝试使用动态类型变量。有助于反序列化。
【讨论】:
这不是答案。 也不是答案。以上是关于如何在 WebAPI 后端 C# 上接收 JSON 数据?的主要内容,如果未能解决你的问题,请参考以下文章
C# webApi----H5_app后台制作--序列化的类无法接收Json格式的数据
如何从不带引号的 WebAPI 控制器发送带有 javascript 函数的 JSON
自定义验证属性未在模型上验证 - WebAPI C# 和 JSON