2011-07-26 12 views
1

Comment associer un objet JSON à un objet C#? Par exemple, la conversion de données en classe C# avec les mêmes propriétés.
J'ai essayé ceci:Convertir un objet JSON en objet 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); 

       } 
      }); 

mais quand j'ai vérifié avec Firebug cette erreur retourné:

{"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

C'est certainement possible. Pourriez-vous poster le code pour 'CreatePerson'? – ShaneBlake

Répondre

4

Vous pouvez certainement le faire, mais vous devez vous assurer que l'objet côté client correspond à votre serveur la structure de classe, les noms de propriété et le nom de paramètre exactement.

Il semble que votre méthode côté serveur attend un paramètre PersonObj, mais vous ne le structurez pas de cette manière côté client. Essayez quelque chose comme ceci:

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

J'ai écrit à faire cela en profondeur ici: http://encosia.com/using-complex-types-to-make-calling-services-less-complex/

+0

voir vous avez gourou d'ajax pour répondre à vos questions j'ai appris tout cela à partir de ses messages merci dave ward !!! – abhijit

+0

@ user648372: Merci pour les mots gentils. J'espère que je peux vivre à ces compliments! –

1

De quel type est votre paramètre PersonObj? Si l'on suppose qu'il est une personne comme ceci:

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

Votre méthode WebService Signation doit être: public static returntype CreatePerson (string jsonPersonObject) {}

Et votre paramètre de données Ajax devrait être:

$.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); 
     } 
}); 

Et puis dans CreatePerson vous devrez analyser le jsonPersonObject dans une personne.

Les manières courantes de faire ceci sont avec Json.NET ou JavaScriptSerializer from System.Web.Extensions.dll. Plus d'informations approfondies se trouve here ou here

+0

Vous ne devez pas sérialiser ou désérialiser manuellement les objets dans les services ASMX. Le framework le fera automatiquement pour vous si vous en profitez (définissez les paramètres d'entrée sur le type que vous voulez désérialiser): http://encosia.com/asp-net-web-services-mistake-manual- json-serialization/ –

+0

Bon à savoir. Étant donné que très peu de contexte a été fourni pour la question, je vais laisser la réponse pour qu'elle soit disponible quand elle sera nécessaire. –

1

faire:

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

utilisation plugin json2 pour stringify votre obeject contexte et de transmettre cette façon

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 
    }); 
}; 

assurez-vous que votre méthode C# est statique et accepte un objet si vous voulez passer en tant que paramètres juste modifiez les données ajaxcall: dataobject, au lieu de reqobject: ''