Я столкнулся с проблемой здесь, я действительно не мог найти способ удалить значения моего следующего объекта JSON в веб-методе
Код ASPX
$(document).ready(function () {
// Add the page method call as an onclick handler for the div.
$("#Button1").click(function () {
$.ajax({
type: "POST",
url: "Default.aspx/MethodCall",
data: '{
"Вызов": '{ "Тип": "U", "Параметры": [ { "Имя": "Джон", "Должность": "Технический директор" } ] } }', contentType: "application/json; charset =utf-8", тип данных: "json", кеш: правда,
success: function (msg) {
// Replace the div's content with the page method's return.
$("#Result").text(msg.d);
},
error: function (xhr, status, error) {
// Display a generic error for now.
var err = eval("(" + xhr.responseText + ")");
alert(err.Message);
}
});
});
});
Код ASPX.CS
[WebMethod]
public static string MethodCall(JObject Call)
{
return "Type of call :"+ Call.Type + "Name is :" + Call.Params.Name + "Position is :"
Call.Params.Position ;
}
заранее большое спасибо.
Ответ 1 · рейтинг 1 · Dave Ward
Метод страницы автоматически десериализует JSON, если вы укажете соответствующий тип во входном параметре. На основе вашего примера строки данных, что-то вроде этого:
public class CallRequest
{
public string Type;
public Dictionary<string, string> Params;
}
public static string MethodCall(CallRequest Call)
{
return "Type of call: " + Call.Type +
"Name is: " + Call.Params["Name"] +
"Position is: " + Call.Params["Position"];
}
Я использовал словарь, потому что вы упомянули гибкость. Если Params предсказуемы, вы можете использовать формальный тип вместо Dictionary. Затем вы можете "точка" в свойствах Param вместо ссылки на ключи словаря.
Ответ 2 · рейтинг 1 · JustinStolle
Я не уверен, что следую вашему коду (это JObject ваш класс?), но если вы используете Json.NET (как указано в вашем вопросе), взгляните на Пример сериализации (от http://james.newtonking.com/projects/json-net.aspx ):
Product product = new Product();
product.Name = "Apple";
product.Expiry = new DateTime(2008, 12, 28);
product.Price = 3.99M;
product.Sizes = new string[] { "Small", "Medium", "Large" };
string json = JsonConvert.SerializeObject(product);
//{
// "Name": "Apple",
// "Expiry": new Date(1230422400000),
// "Price": 3.99,
// "Sizes": [
// "Small",
// "Medium",
// "Large"
// ]
//}
Product deserializedProduct = JsonConvert.DeserializeObject<Product>(json);
Учитывая строку Json, он может десериализовать ее в экземпляр класса, который он представляет.
Ответ 3 · рейтинг 1 · JustinStolle
Следуя вашему примеру кода, если вы выполняете следующий jQuery JavaScript на клиенте (оставьте contentType по умолчанию);
$(document).ready(function() {
// Add the page method call as an onclick handler for the div.
$("#Button1").click(function() {
$.ajax({
type: "POST",
url: "Default.aspx/MethodCall",
data: { call: '{ "Type": "U", "Params": { "Name": "John", "Position": "CTO"} }' },
//contentType: "application/x-www-form-urlencoded",
dataType: "json",
cache: true,
success: function(msg) {
// Replace the div's content with the page method's return.
$("#Result").text(msg.d);
},
error: function(xhr, status, error) {
// Display a generic error for now.
var err = eval("(" + xhr.responseText + ")");
alert(err.Message);
}
});
});
});
вы потенциально можете сделать что-то подобное на стороне сервера, предполагая использование Json.NET (находится по адресу http://json.codeplex.com/), но вам нужно десериализовать строку в объект:
using Newtonsoft.Json;
public class JsonMethodCallObject {
public string Type { get; set; }
public System.Collections.Hashtable Params { get; set; }
}
[WebMethod]
public static string MethodCall(string call) {
try {
JsonMethodCallObject deserializedObject = JsonConvert.DeserializeObject<JsonMethodCallObject>(call);
return JsonConvert.SerializeObject(new {
d = "Type of call: " + deserializedObject.Type +
", Name is: " + deserializedObject.Params["Name"] +
", Position is: " + deserializedObject.Params["Position"]
});
} catch (Exception ex) {
return JsonConvert.SerializeObject(new { d = ex.Message });
}
}