通过复杂的JSON字符串1个参数的webmethod在c# - desearialize成对象(json.net)?
-
23-08-2019 - |
题
我已经快乐使用具有javascript对象序列化为JSON
JSON.stringify
和一起在C#/ asp.net我的“静态”的WebMethod发送和确保足够多的到达。我需要的参数,正确的数量,因此,如果我json对象有“的startDate”,“结束日期”,“储备”,那么我的webmethod需要这些作为参数。
“基本上与我的顺序对象我有,我有许多的该对象上的参数,所以我需要使用上的webmethod相同数目的 - 这是有点杂乱??” - 我将解释
我在JavaScript中有一个相当复杂“订单”对象,并希望使用字符串化序列化,并跟着我的webmethod送,但我不想指定所有参数是有办法解决这?
我希望这样的事情在我的webmethod
public static bool MakeReservation(object order)
然后在我的webmethod我只有1个参数但我可以desearilize此使用JSON.NET一个真正的C#对象。我已经尝试过这样的跨越发送JSON但因为我的webmethod只有1个参数,它的失败。
基本上我想说,如果我说我想继续使用我的webmethod,但我不希望有做对的WebMethod指定15个参数
我要的JSON - 字符串抵入我的webmethod,然后我可以分解它在服务器上
。这是可能的?
下面是如何我使用的jquery目前发送我的JSON到服务器(的webmethod)
var jsonData = JSONNew.stringify(orderObject);
$.ajax({
type: "POST",
url: "MyService.aspx/DoReservation",
data: jsonData,
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function(msg) {
success = true;
},
error: function(msg) {
success = false;
},
async: false
});
解决方案
如果您尝试提交一个对象,它是这样的:
JSON.stringify({ endDate: new Date(2009, 10, 10), startDate: new Date() });
它会尝试映射结束日期和STARTDATE至您的webmethod相应的参数。既然你只希望接受一个单一的方法,我怀疑你可以通过提交下列摆脱它:
JSON.stringify({ order: orderObject });
它可能合理地尝试分配的价值,你的webmethod的“秩序”的参数。如果做不到这一点,提交
JSON.stringify({ order: JSON.stringify(orderObject) });
,然后使用JSON.NET一定要反序列化的工作,但它的丑陋,所以首先尝试的第一个例子。这是我最好的拍摄。
其他提示
这是可能的。我不是在解释的东西那么好,我就告诉你我的例子代码:
使用Javascript:
var Order = function(name, orderid, price) {
this.name = name;
this.orderid = orderid;
this.price = price;}
var pagePath = window.location.pathname;
function setOrder() {
var jsOrder = new Order("Smith", 32, 150);
var jsonText = JSON.stringify({ order: jsOrder });
$.ajax({
type: "POST",
url: pagePath + "/SetOrder",
contentType: "application/json; charset=utf-8",
data: jsonText,
dataType: "json",
success: function(response) {
alert("wohoo");
},
error: function(msg) { alert(msg); }
});
}
后面 C#代码
public class Order
{
public string name { get; set; }
public int orderid { get; set; }
public int price { get; set; }
}
[WebMethod]
public static void SetOrder(object order)
{
Order ord = GetOrder(order);
Console.WriteLine(ord.name +","+ord.price+","+ord.orderid);
}
public static Order GetOrder(object order)
{
Order ord = new Order();
Dictionary<string,object> tmp = (Dictionary<string,object>) order;
object name = null;
object price = null;
object orderid = null;
tmp.TryGetValue("name", out name);
tmp.TryGetValue("price", out price);
tmp.TryGetValue("orderid", out orderid);
ord.name = name.ToString();
ord.price = (int)price;
ord.orderid = (int) orderid;
return ord;
}
我的代码是不是漂亮,但我希望你能得到它的含义。
最近,我通过这个非常问题与配合物JSON对象,我想在我的控制器deserilize去了。唯一的区别是我用的是客户端,而不是.stringify在.toJSON插件。
在简单的答案:
public static bool MakeReservation(string orderJSON)
{
var serializer = new JavaScriptSerializer();
var order = serializer.Deserialize<Order>(orderJSON);
}
现在,作为一个长期的解决方案,我们创建一个自定义ActionFilterAttribute处理这些情况。它检测到的JSON参数和手柄deserilizing对象和映射到该操作。您可能要考虑这样做。