2011-07-26 408 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:''