使用JSON.NET反序列化JSON对象

使用JSON.NET反序列化JSON对象,json,asp.net-ajax,Json,Asp.net Ajax,我在这里面临一个问题,我真的找不到一种方法能够在web方法中去掉我下面的JSON对象的值 ASPX代码 $(document).ready(function () { // Add the page method call as an onclick handler for the div. $("#Button1").click(function () { $.ajax({ type: "POST

我在这里面临一个问题,我真的找不到一种方法能够在web方法中去掉我下面的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:“应用程序/json;字符集=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 ;







}

非常感谢advanced。

我不确定我是否遵循了您的代码(JObject是您的类吗?),但是如果您使用的是Json.NET(如您的问题所述),请查看序列化示例(来自):

产品产品=新产品();
product.Name=“苹果”;
产品有效期=新的日期时间(2008年12月28日);
产品价格=399万元;
product.size=新字符串[]{“小”、“中”、“大”};
字符串json=JsonConvert.SerializeObject(产品);
//{
//“名称”:“苹果”,
//“到期日”:新日期(1230422400000),
//“价格”:3.99,
//“尺寸”:[
//“小”,
//“中等”,
//“大”
//  ]
//}
Product deserializedProduct=JsonConvert.DeserializeObject(json);

给定一个Json字符串,它可以将其反序列化为它所表示的类的实例。

我不确定是否遵循了您的代码(JObject是您的类吗?),但如果您使用的是Json.NET(如您的问题所述),请看一下序列化示例(摘自):

产品产品=新产品();
product.Name=“苹果”;
产品有效期=新的日期时间(2008年12月28日);
产品价格=399万元;
product.size=新字符串[]{“小”、“中”、“大”};
字符串json=JsonConvert.SerializeObject(产品);
//{
//“名称”:“苹果”,
//“到期日”:新日期(1230422400000),
//“价格”:3.99,
//“尺寸”:[
//“小”,
//“中等”,
//“大”
//  ]
//}
Product deserializedProduct=JsonConvert.DeserializeObject(json);

给定一个Json字符串,它可以将其反序列化为它所表示的类的实例。

如果您在客户端上执行以下jQuery JavaScript,则遵循示例代码(将contentType保留为默认值)

假设使用Json.NET(位于),您可以在服务器端执行类似的操作,但必须将字符串反序列化为对象:

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 });
  }
}
使用Newtonsoft.Json;
公共类JsonMethodCallObject{
公共字符串类型{get;set;}
public System.Collections.Hashtable参数{get;set;}
}
[网络方法]
公共静态字符串方法调用(字符串调用){
试一试{
JsonMethodCallObject deserializedObject=JsonConvert.DeserializeObject(调用);
返回JsonConvert.SerializeObject(新{
d=“调用类型:”+反序列化对象。类型+
,名称为:“+deserializedObject.Params[“Name”]+
,位置为:“+deserializedObject.Params[“Position”]
});
}捕获(例外情况除外){
返回JsonConvert.SerializeObject(新的{d=ex.Message});
}
}

遵循示例代码,如果在客户端上执行以下jQuery JavaScript(将contentType保留为默认值)

假设使用Json.NET(位于),您可以在服务器端执行类似的操作,但必须将字符串反序列化为对象:

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 });
  }
}
使用Newtonsoft.Json;
公共类JsonMethodCallObject{
公共字符串类型{get;set;}
public System.Collections.Hashtable参数{get;set;}
}
[网络方法]
公共静态字符串方法调用(字符串调用){
试一试{
JsonMethodCallObject deserializedObject=JsonConvert.DeserializeObject(调用);
返回JsonConvert.SerializeObject(新{
d=“调用类型:”+反序列化对象。类型+
,名称为:“+deserializedObject.Params[“Name”]+
,位置为:“+deserializedObject.Params[“Position”]
});
}捕获(例外情况除外){
返回JsonConvert.SerializeObject(新的{d=ex.Message});
}
}

如果在输入参数上指定匹配类型,page方法将自动反序列化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"];
}
公共类调用请求
{
公共字符串类型;
公共字典参数;
}
公共静态字符串MethodCall(CallRequest调用)
{
return“调用类型:”+call.Type+
名称为:“+Call.Params[“Name”]+
“位置为:”+调用参数[“位置”];
}

我在那里用了一本字典,因为你提到了灵活性。如果
参数
是可预测的,则可以在那里使用正式类型而不是字典。然后,您可以将“点”到Param的属性中,而不是引用字典键。

如果您在输入参数上指定匹配类型,page方法将自动为您反序列化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"];
}
公共类调用请求
{
公共字符串类型;
公共字典参数;
}
公共静态字符串MethodCall(CallRequest调用)
{
return“调用类型:”+call.Type+
名称为:“+Call.Params[“Name”]+
“位置为:”+调用参数[“位置”];
}

我在那里用了一本字典,因为你提到了灵活性。如果
参数
是可预测的,则可以在那里使用正式类型而不是字典。然后,您可以“点”到Param的属性中,而不是引用字典键。

感谢您的回复,Jobject是来自客户端的json提交,我只想访问json值,而不是将其转换为对象,例如,我只想访问名称值,或者您发布的json字符串的大小,这是正确的,所以我不确定为什么你的方法接受JObject类型的东西。我认为,如果不先将Json值转换为对象,就说您想要“访问Json值”,这是没有意义的。就我所知,这种弱类型的数据结构可以在JavaScript中实现,而不是在C#中实现。是