Передача сложной строки JSON в веб-метод с 1 параметром в С# – десериализация в объект (json.net)?
-
23-08-2019 - |
Вопрос
Я был счастлив сериализовать объекты 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 и обрабатывает десериализацию объекта и сопоставление с действием.Возможно, вы захотите сделать то же самое.