Передача сложной строки JSON в веб-метод с 1 параметром в С# – десериализация в объект (json.net)?

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

Вопрос

Я был счастлив сериализовать объекты javascript в JSON, используя

         JSON.stringify

И отправив мой «статический» веб-метод в С#/asp.net, и он, конечно же, прибудет..Мне нужно правильное количество параметров, поэтому, если мой объект json имеет «startDate», «endDate», «reserve», тогда моему веб-методу они нужны в качестве параметров.

«По сути, с моим объектом заказа, который у меня есть, у меня есть несколько параметров на этом объекте, поэтому мне нужно было бы использовать один и тот же номер на WebMethod - это немного грязно?» - Я объясню

У меня есть довольно сложный объект «Заказ» в JavaScript, и я хочу сериализовать его с помощью stringify и отправить в свой веб-метод, но я не хочу указывать все параметры. Есть ли способ обойти это?

Я надеялся на что-то подобное в своем веб-методе

           public static bool MakeReservation(object order)

Тогда в моем веб-методе у меня есть только 1 параметр, НО затем я могу преобразовать его в настоящий объект С#, используя JSON.NET.Я попробовал это сделать, отправив json, но поскольку в моем веб-методе есть ТОЛЬКО 1 параметр, он не работает.

По сути, я пытаюсь сказать, хочу ли я продолжать использовать свой веб-метод, но не хочу указывать 15 параметров в веб-методе.

Я хочу, чтобы JSON-String поступала в мой веб-метод, а затем я мог разложить ее на сервере.

Это возможно?

Вот как я сейчас отправляю свой JSON на сервер (веб-метод) с помощью jquery

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

он попытается сопоставить endDate и startDate с соответствующими параметрами вашего веб-метода.Поскольку вы хотите принять только один метод, я подозреваю, что вам это сойдет с рук, отправив следующее:

JSON.stringify({ order: orderObject });

Что он мог бы разумно попытаться присвоить в качестве значения параметру «order» вашего веб-метода.В противном случае отправка

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, который хотел десериализовать в своем контроллере.Единственная разница в том, что я использовал на клиенте плагин .toJSON вместо .stringify.

Простой ответ:

public static bool MakeReservation(string orderJSON)
{
    var serializer = new JavaScriptSerializer();
    var order = serializer.Deserialize<Order>(orderJSON);
}

Теперь в качестве долгосрочного решения мы создали собственный ActionFilterAttribute для обработки этих случаев.Он определяет параметры JSON и обрабатывает десериализацию объекта и сопоставление с действием.Возможно, вы захотите сделать то же самое.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top