Десериализовать объект 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)


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

Я не уверен, что следую вашему коду (это 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

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