«Primitive JSON invalide» dans le traitement Ajax

Je reçois une erreur dans un appel ajax depuis jQuery.

Voici ma fonction jQuery:

function DeleteItem(RecordId, UId, XmlName, ItemType, UserProfileId) { var obj = { RecordId: RecordId, UserId: UId, UserProfileId: UserProfileId, ItemType: ItemType, FileName: XmlName }; var json = Sys.Serialization.JavaScriptSerializer.serialize(obj); $.ajax({ type: "POST", url: "EditUserProfile.aspx/DeleteRecord", data: json, contentType: "application/json; charset=utf-8", dataType: "json", async: true, cache: false, success: function(msg) { if (msg.d != null) { RefreshData(ItemType, msg.d); } }, error: function(XMLHttpRequest, textStatus, errorThrown) { alert("error occured during deleting"); } }); } 

et WebMethod ma WebMethod :

 [WebMethod] public static ssortingng DeleteRecord(Int64 RecordId, Int64 UserId, Int64 UserProfileId, ssortingng ItemType, ssortingng FileName) { try { ssortingng FilePath = HttpContext.Current.Server.MapPath(FileName); XDocument xmldoc = XDocument.Load(FilePath); XElement Xelm = xmldoc.Element("UserProfile"); XElement parentElement = Xelm.XPathSelectElement(ItemType + "/Fields"); (from BO in parentElement.Descendants("Record") where BO.Element("Id").Atsortingbute("value").Value == RecordId.ToSsortingng() select BO).Remove(); XDocument xdoc = XDocument.Parse(Xelm.ToSsortingng(), LoadOptions.PreserveWhitespace); xdoc.Save(FilePath); UserInfoHandler obj = new UserInfoHandler(); return obj.GetHTML(UserId, UserProfileId, FileName, ItemType, RecordId, Xelm).ToSsortingng(); } catch (Exception ex) { HandleException.LogError(ex, "EditUserProfile.aspx", "DeleteRecord"); } return "success"; } 

Quelqu’un peut-il s’il vous plaît me dire ce qui ne va pas dans mon code?

Je reçois cette erreur:

 { "Message":"Invalid JSON primitive: RecordId.", "StackTrace":" at System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializePrimitiveObject() at System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeInternal(Int32 depth) at System.Web.Script.Serialization.JavaScriptObjectDeserializer.BasicDeserialize(Ssortingng input, Int32 depthLimit, JavaScriptSerializer serializer) at System.Web.Script.Serialization.JavaScriptSerializer.Deserialize(JavaScriptSerializer serializer, Ssortingng input, Type type, Int32 depthLimit) at System.Web.Script.Serialization.JavaScriptSerializer.Deserialize[T](Ssortingng input) at System.Web.Script.Services.RestHandler.GetRawParamsFromPostRequest(HttpContext context, JavaScriptSerializer serializer) at System.Web.Script.Services.RestHandler.GetRawParams(WebServiceMethodData methodData, HttpContext context) at System.Web.Script.Services.RestHandler.ExecuteWebServiceCall(HttpContext context, WebServiceMethodData methodData)", "ExceptionType":"System.ArgumentException" } 

Juste une idée de ce que la variable json contient après

 var json = Sys.Serialization.JavaScriptSerializer.serialize(obj);? 

S’il s’agit d’un object json valide comme {'foo':'foovalue', 'bar':'barvalue'} alors jQuery pourrait ne pas l’envoyer en tant que données json mais le sérialiser en foor=foovalue&bar=barvalue "Invalid JSON primitive: foo"

Essayez plutôt de définir les données sous forme de chaîne

 $.ajax({ ... data: "{'foo':'foovalue', 'bar':'barvalue'}", //note the additional quotation marks ... }) 

De cette façon, jQuery devrait laisser les données seules et envoyer la chaîne telle quelle au serveur, ce qui devrait permettre à ASP.NET d’parsingr le côté serveur json.

En utilisant

 data : JSON.ssortingngify(obj) 

dans la situation ci-dessus aurait travaillé je crois.

Note: Vous devriez append la bibliothèque json2.js tous les navigateurs ne supportent pas cet object JSON (IE7-) Différence entre json.js et json2.js

Comme noté par la gigue, la fonction $.ajax sérialise tout object / tableau utilisé comme paramètre de data dans un format encodé en URL. Assez curieusement, le paramètre dataType ne s’applique qu’à la réponse du serveur – et non aux données de la requête.

Après avoir rencontré le même problème, j’ai téléchargé et utilisé le plug-in jquery-json pour encoder correctement les données de la requête dans ScriptService. Ensuite, utilisez la fonction $.toJSON pour encoder les arguments souhaités à envoyer au serveur:

 $.ajax({ type: "POST", url: "EditUserProfile.aspx/DeleteRecord", data: $.toJSON(obj), contentType: "application/json; charset=utf-8", dataType: "json" .... }); 

Jquery Ajax enverra par défaut les données sous la forme de parameters de chaîne de requête tels que:

 RecordId=456&UserId=123 

sauf si l’option processData est définie sur false, auquel cas elle sera envoyée en tant qu’object au serveur.

  • contentType option contentType est pour le serveur le format dans lequel le client a envoyé les données.

  • dataType option dataType est pour le serveur qui indique quel type de client de données attend du serveur.

Ne spécifiez pas contentType pour que le serveur les parsing en tant que parameters de chaîne de requête et non json.

OU

Utilisez contentType comme ‘application / json; charset = utf-8 ‘et utilisez JSON.ssortingngify (object) pour que le serveur puisse désérialiser json de la chaîne.

ça marche quelque chose comme ça

 data: JSON.ssortingngify({'id':x}), 

Je suppose que @jitter avait raison, mais sa solution ne fonctionnait pas pour moi.

Voici ce que cela a fonctionné:

 $.ajax({ ... data: "{ intFoo: " + intFoo + " }", ... }); 

Je n’ai pas essayé mais je pense que si le paramètre est une chaîne, il devrait être comme ceci:

 $.ajax({ ... data: "{ intFoo: " + intFoo + ", strBar: '" + strBar + "' }", ... }); 

Si vous formatez manuellement JSON, il existe un validateur très pratique ici: jsonlint.com

Utilisez des guillemets doubles plutôt que des guillemets simples:

Invalide:

 { 'project': 'a2ab6ef4-1a8c-40cd-b561-2112b6baffd6', 'franchise': '110bcca5-cc74-416a-9e2a-f90a8c5f63a0' } 

Valide:

 { "project": "a2ab6ef4-1a8c-40cd-b561-2112b6baffd6", "franchise": "18e899f6-dd71-41b7-8c45-5dc0919679ef" } 

J’étais confronté au même problème, ce que je suis venu avec une bonne solution est comme ci-dessous:

Essaye ça…

 $.ajax({ type: "POST", url: "EditUserProfile.aspx/DeleteRecord", data: '{RecordId: ' + RecordId + ', UserId: ' + UId + ', UserProfileId:' + UserProfileId + ', ItemType: \'' + ItemType + '\', FileName: '\' + XmlName + '\'}', contentType: "application/json; charset=utf-8", dataType: "json", async: true, cache: false, success: function(msg) { if (msg.d != null) { RefreshData(ItemType, msg.d); } }, error: function(XMLHttpRequest, textStatus, errorThrown) { alert("error occured during deleting"); } }); 

S’il vous plaît noter ici pour le paramètre de type de chaîne j’ai utilisé (\ ‘) caractère de séquence d’échappement pour le désigner comme valeur de chaîne.

Sur le serveur, pour sérialiser / désérialiser json en objects personnalisés:

 public static ssortingng Serialize(T obj) { DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType()); MemoryStream ms = new MemoryStream(); serializer.WriteObject(ms, obj); ssortingng retVal = Encoding.UTF8.GetSsortingng(ms.ToArray()); return retVal; } public static T Deserialize(ssortingng json) { T obj = Activator.CreateInstance(); MemoryStream ms = new MemoryStream(Encoding.Unicode.GetBytes(json)); DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType()); obj = (T)serializer.ReadObject(ms); ms.Close(); return obj; } 

ces réponses m’ont juste fait rebondir entre un paramètre invalide et un paramètre manquant.

cela a fonctionné pour moi, juste envelopper les variables de chaîne entre guillemets …

 data: { RecordId: RecordId, UserId: UId, UserProfileId: UserProfileId, ItemType: '"' + ItemType + '"', FileName: '"' + XmlName + '"' }