通过复杂的JSON字符串1个参数的webmethod在c# - desearialize成对象(json.net)?

StackOverflow https://stackoverflow.com/questions/1087928

我已经快乐使用具有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对象和映射到该操作。您可能要考虑这样做。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top