Jquery Ajax Veröffentlichen von json zum Webservice

Ich versuche, ein JSON-Objekt auf einem ASP.net-Webservice zu veröffentlichen.

Mein JSon sieht so aus:

var markers = { "markers": [ { "position": "128.3657142857143", "markerPosition": "7" }, { "position": "235.1944023323615", "markerPosition": "19" }, { "position": "42.5978231292517", "markerPosition": "-3" } ]}; 

Ich verwende die json2.js, um mein json-Objekt zu stringyfy.

und ich benutze jquery, um es auf meinem Webservice zu veröffentlichen.

  $.ajax({ type: "POST", url: "/webservices/PodcastService.asmx/CreateMarkers", data: markers, contentType: "application/json; charset=utf-8", dataType: "json", success: function(data){alert(data);}, failure: function(errMsg) { alert(errMsg); } }); 

Ich erhalte den folgenden Fehler:

“Ungültiges JSON-Primitiv:

Ich habe eine Reihe von Posts dazu gefunden und es scheint ein wirklich häufiges Problem zu sein, aber nichts, was ich versuche, behebt das Problem.

Wenn Firebug was auf den Server gepostet wird, sieht es so aus:

Markierungen% 5B0% 5D% 5Bposition% 5D = 128.3657142857143 & Markierungen% 5B0% 5D% 5BmarkerPosition% 5D = 7 & Markierungen% 5B1% 5D% 5BPosition% 5D = 235.1944023323615 & Markierungen% 5B1% 5D% 5BmarkerPosition% 5D = 19 & Markierungen% 5B2% 5D% 5BPosition% 5D = 42.5978231292517 & Markierungen% 5B2% 5D% 5BmarkerPosition% 5D = -3

Meine Webservice-function, die aufgerufen wird, ist:

 [WebMethod] public string CreateMarkers(string markerArray) { return "received markers"; } 

Sie haben erwähnt, dass Sie json2.js verwenden, um Ihre Daten zu stringieren, aber die POST-Daten scheinen URLE-codiert zu sein. JSON Sie haben es vielleicht schon gesehen, aber dieser Post über das ungültige JSON-Primitiv deckt ab, warum JSON URLEncodiert wird.

Ich rate davon ab , eine rohe, manuell serialisierte JSON-Zeichenfolge an Ihre Methode zu übergeben . ASP.NET wird JSON automatisch die POST-Daten der Anfrage deserialisieren. Wenn Sie also eine JSON-Zeichenfolge manuell serialisieren und an ASP.NET senden, müssen Sie Ihre serialisierte JSON-Zeichenfolge in JSON serialisieren.

Ich würde etwas mehr in diesem Sinne vorschlagen:

 var markers = [{ "position": "128.3657142857143", "markerPosition": "7" }, { "position": "235.1944023323615", "markerPosition": "19" }, { "position": "42.5978231292517", "markerPosition": "-3" }]; $.ajax({ type: "POST", url: "/webservices/PodcastService.asmx/CreateMarkers", // The key needs to match your method's input parameter (case-sensitive). data: JSON.stringify({ Markers: markers }), contentType: "application/json; charset=utf-8", dataType: "json", success: function(data){alert(data);}, failure: function(errMsg) { alert(errMsg); } }); 

Der Schlüssel zur Vermeidung des ungültigen JSON-Grundproblems besteht darin, jQuery eine JSON-Zeichenfolge für den Datenparameter und kein JavaScript-Objekt zu übergeben, sodass jQuery nicht versucht, Ihre Daten URLEncode zu geben.

Passen Sie auf der Serverseite die Eingabeparameter Ihrer Methode an die Form der Daten an, die Sie übergeben:

 public class Marker { public decimal position { get; set; } public int markerPosition { get; set; } } [WebMethod] public string CreateMarkers(List Markers) { return "Received " + Markers.Count + " markers."; } 

Sie können auch ein Array wie Marker[] Markers akzeptieren, wenn Sie dies bevorzugen. Der Deserializer, den ASMX ScriptServices verwendet (JavaScriptSerializer), ist ziemlich flexibel und wird alles tun, um Ihre Eingabedaten in den von Ihnen angegebenen serverseitigen Typ zu konvertieren.

  1. markers ist kein JSON-Objekt. Es ist ein normales JavaScript-Objekt.
  2. Lesen Sie über die data: Option :

    Daten, die an den Server gesendet werden sollen. Es wird in eine Abfragezeichenfolge konvertiert, wenn nicht bereits eine Zeichenfolge.

Wenn Sie die Daten als JSON senden möchten, müssen Sie sie zuerst verschlüsseln:

 data: {markers: JSON.stringify(markers)} 

jQuery konvertiert Objekte oder Arrays nicht automatisch in JSON.


Aber ich nehme an, die Fehlermeldung kommt von der Interpretation der Antwort des Dienstes. Der gesendete Text ist kein JSON. JSON-Zeichenfolgen müssen in doppelte Anführungszeichen eingeschlossen werden. Also müsstest du folgendes tun:

 return "\"received markers\""; 

Ich bin mir nicht sicher, ob das eigentliche Problem das Senden oder Empfangen der Daten ist.

Ich bin diesem auch begegnet und das ist meine Lösung.

Wenn beim Analysieren von Daten eine ungültige JSON-Objektausnahme auftritt, obwohl Sie wissen, dass Ihre JSON-Zeichenfolge korrekt ist, stringulieren Sie die Daten, die Sie in Ihrem AJAX-Code erhalten haben, bevor Sie sie nach JSON analysieren:

 $.post(CONTEXT+"servlet/capture",{ yesTransactionId : yesTransactionId, productOfferId : productOfferId }, function(data){ try{ var trimData = $.trim(JSON.stringify(data)); var obj = $.parseJSON(trimData); if(obj.success == 'true'){ //some codes ... 

Ich habe Dave Wards Lösung versucht. Der Datenteil wurde nicht vom Browser im Payload-Teil der Post-Anfrage gesendet, da der contentType auf "application/json" . Sobald ich diese Linie entfernt habe, hat alles super funktioniert.

 var markers = [{ "position": "128.3657142857143", "markerPosition": "7" }, { "position": "235.1944023323615", "markerPosition": "19" }, { "position": "42.5978231292517", "markerPosition": "-3" }]; $.ajax({ type: "POST", url: "/webservices/PodcastService.asmx/CreateMarkers", // The key needs to match your method's input parameter (case-sensitive). data: JSON.stringify({ Markers: markers }), contentType: "application/json; charset=utf-8", dataType: "json", success: function(data){alert(data);}, failure: function(errMsg) { alert(errMsg); } }); 

Ich habe eine Frage,

 $("#login-button").click(function(e){ alert("hiii"); var username = $("#username-field").val(); var password = $("#username-field").val(); alert(username); alert("password" + password); var markers = { "userName" : "admin","password" : "admin123"}; $.ajax({ type: "POST", url: url, // The key needs to match your method's input parameter (case-sensitive). data: JSON.stringify(markers), contentType: "application/json; charset=utf-8", dataType: "json", success: function(data){alert("got the data"+data);}, failure: function(errMsg) { alert(errMsg); } }); }); 

Ich poste die Zugangsdaten in json und erhalte eine Zeichenfolge als "Success" , aber ich bekomme keine Antwort.

Bitte folgen Sie diesem bis zum Ajax Aufruf zum Webservice von java var param = {feildName: feilvalue}; JSON.stringify ({daten: param})

 $.ajax({ dataType : 'json', type : 'POST', contentType : 'application/json', url : '< %=request.getContextPath()%>/rest/priceGroups', data : JSON.stringify({data : param}), success : function(res) { if(res.success == true){ $('#alertMessage').html('Successfully price group created.').addClass('alert alert-success fade in'); $('#alertMessage').removeClass('alert-danger alert-info'); initPriceGroupsList(); priceGroupId = 0; resetForm(); }else{ $('#alertMessage').html(res.message).addClass('alert alert-danger fade in'); } $('#alertMessage').alert(); window.setTimeout(function() { $('#alertMessage').removeClass('in'); document.getElementById('message').style.display = 'none'; }, 5000); } });