2011-07-26 409 views
1

如何将JSON对象映射到C#对象?将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"} 
+0

这当然有可能。你可以发布'CreatePerson'的代码吗? – ShaneBlake

回答

4

你绝对可以做,但你需要确保客户端对象服务器相匹配精确的侧面结构,属性名称和参数名称。

听起来好像您的服务器端方法预计参数为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/

+0

看到你有ajax的大师来回答你的问题,我从他的帖子了解到这一切,谢谢戴夫病房! – abhijit

+0

@ user648372:谢谢你的客气话。我希望我能辜负那些赞美! –

1

什么类型是你的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方法signation应该是: 公共静态返回类型 CreatePerson(字符串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

+0

您不应该手动序列化或反序列化ASMX服务中的对象。如果您利用它,将自动为您执行此操作(将输入参数设置为您希望它反序列化的类型):http://encosia.com/asp-net-web-services-mistake-manual- json-serialization/ –

+0

很高兴知道。由于这个问题的背景很少,我会留下答案,以便在需要时提供。 –

1

做到这一点:

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

使用json2插件字符串化的背景下obeject,并通过这种方式

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:''