【问题标题】:Cast JSON object to C# Object将 JSON 对象转换为 C# 对象
【发布时间】:2011-07-26 18:47:16
【问题描述】:

如何将 JSON 对象映射到 C# 对象?

  var Data = JSON.stringify({
                    FirstName: "sdfsdf",
                    LastName: "sdfsdf", Age: "sdfsdf", Descrp: "sdfsdf"
                });

例如将 Data 转换为具有相同属性的 C# 类。
我试过这个:

 var Data = JSON.stringify({
                FirstName: "sdfsdf",
                LastName: "sdfsdf", Age: "sdfsdf", Descrp: "sdfsdf"
            });
            $.ajax({
                type: "POST",
                url: "Services/CRUD.asmx/CreatePerson",
                data: Data,
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                success: function (msg) {
                    alert(msg.d);

                }
            });

但是当我检查萤火虫这个错误返回:

{"Message":"Invalid web service call, missing value for parameter: \u0027PersonObj\u0027.","StackTrace":"   at System.Web.Script.Services.WebServiceMethodData.CallMethod(Object target, IDictionary`2 parameters)\r\n   at System.Web.Script.Services.WebServiceMethodData.CallMethodFromRawParams(Object target, IDictionary`2 parameters)\r\n   at System.Web.Script.Services.RestHandler.InvokeMethod(HttpContext context, WebServiceMethodData methodData, IDictionary`2 rawParams)\r\n   at System.Web.Script.Services.RestHandler.ExecuteWebServiceCall(HttpContext context, WebServiceMethodData methodData)","ExceptionType":"System.InvalidOperationException"}

【问题讨论】:

  • 这当然是可能的。你能把CreatePerson的代码贴出来吗?

标签: asp.net json jquery


【解决方案1】:

您绝对可以这样做,但您需要确保客户端对象与您的服务器端类结构、属性名称和参数名称完全匹配。

听起来您的服务器端方法需要PersonObj 参数,但您并没有在客户端以这种方式构造它。试试这样的:

var Data = JSON.stringify({ 
  PersonObj: {
    FirstName: 'foo',
    LastName: 'bar',
    Age: 99,
    Descrp: 'foo person'
  }
});   

我在这里写过关于做这件事的深入文章:http://encosia.com/using-complex-types-to-make-calling-services-less-complex/

【讨论】:

  • 看到你有 ajax 大师来回答你的问题,我从他的帖子中学到了这一切,感谢 dave ward!!!
  • @user648372:谢谢你的客气话。我希望我能不辜负这些赞美!
【解决方案2】:

这样做:

 var context = new object();
 context.firstname = "sdfsdf";
 context.lname = "sdfsdf";
 context.age="sdfsdf";
 context.descrp= "sdfsdf"
 ajaxCall("functionname", context, ajaxCallSuccess, ajaxCallFailure, "pagename.aspx");

使用 json2 插件来字符串化你的上下文对象并通过这种方式

function ajaxCall(funtionname, reqObject, successFn, errorFn, theaspxPage) {

    var dataObject = JSON.stringify(reqObject);

    //Call the page method  
    $.ajax({
        async: false,
        type: "POST",
        url: aspxPage + "/" + fn,
        contentType: "application/json;",
        data: "{'reqObject':" + dataObject + "}",
        dataType: "json",
        success: successFn,
        error: errorFn
    });
};

确保你的 c# 方法是静态的并且接受一个对象 如果你只想作为参数传递 调整 ajaxcall data:dataobject,而不是 reqobject:''

【讨论】:

    【解决方案3】:

    您的 PersonObj 参数是什么类型?假设它是这样的人:

    public class Person
    {
       public string FirstName { get;set;}
       public string LastName { get;set;}
       public string Age { get;set;}
       public string Descrp { get;set;}
    }
    

    您的 WebService 方法签名应该是: 公共静态 returntype CreatePerson(string jsonPersonObject) {}

    你的 Ajax 数据参数应该是:

    $.ajax({
           type: "POST",
           url: "Services/CRUD.asmx/CreatePerson",
           data: {'jsonPersonObject' : Data },
           contentType: "application/json; charset=utf-8",
           dataType: "json",
           success: function (msg) {
              alert(msg.d);
           }
    });
    

    然后在 CreatePerson 中,您必须将 jsonPersonObject 解析为 Person。

    执行此操作的常用方法是使用Json.NETJavaScriptSerializer from System.Web.Extensions.dll。更深入的信息可以找到herehere

    【讨论】:

    • 您不应该在 ASMX 服务中手动序列化或反序列化对象。如果您利用它,框架会自动为您执行此操作(将输入参数设置为您希望它反序列化的类型):encosia.com/…
    • 很高兴知道。由于给出的问题背景很少,所以我会留下答案,以便在需要时可以使用。
    猜你喜欢
    • 2016-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-02
    • 1970-01-01
    • 2011-11-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多