Десериализовать объект JSON с помощью JSON.NET

Я столкнулся с проблемой здесь, я действительно не мог найти способ удалить значения моего следующего объекта 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 ;


}

заранее большое спасибо.


person DevMania    schedule 03.07.2010    source источник


Ответы (3)


arrow_upward
1
arrow_downward

Метод страницы автоматически десериализует 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 вместо ссылки на ключи словаря.

person Dave Ward    schedule 05.07.2010

arrow_upward
1
arrow_downward

Я не уверен, что следую вашему коду (это 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, он может десериализовать ее в экземпляр класса, который он представляет.

person JustinStolle    schedule 03.07.2010
comment
большое спасибо за ответ, Jobject - это json, поступающий со стороны клиента, я просто хочу получить доступ к значениям Json, а не преобразовывать их в объект, как например, в примере, я просто хочу получить доступ к значению имени или массиву размеров - person DevMania; 05.07.2010
comment
Вы публикуете строку JSON, что правильно, поэтому я не уверен, почему ваш метод принимает что-то типа JObject. Я не думаю, что имеет смысл говорить, что вы хотите «получить доступ к значениям Json» без предварительного преобразования его в объект. Насколько мне известно, такая структура данных со слабой типизацией доступна в JavaScript, а не в C#. Вы пытаетесь использовать Newtonsoft Json.NET, как следует из названия вопроса? - person JustinStolle; 05.07.2010
comment
Большое спасибо, что объяснили это для меня :) - person DevMania; 06.07.2010

arrow_upward
1
arrow_downward

Следуя вашему примеру кода, если вы выполняете следующий 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 });
  }
}
person JustinStolle    schedule 05.07.2010