Ich versuche, ein JSON-Objekt an einen asp.net-Webservice zu senden.
Mein json sieht wie folgt aus:
var markers = { "markers": [
{ "position": "128.3657142857143", "markerPosition": "7" },
{ "position": "235.1944023323615", "markerPosition": "19" },
{ "position": "42.5978231292517", "markerPosition": "-3" }
]};
Ich verwende json2.js, um mein json-Objekt in Strings zu verwandeln.
und ich verwende Jquery, um es an meinen Webservice zu senden.
$.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 Beiträgen in Bezug auf diese gefunden und es scheint ein wirklich gemeinsames Problem zu sein, aber nichts, was ich versuche, behebt das Problem.
Wenn Firebug was an den Server gesendet wird, sieht es wie folgt aus:
markers%5B0%5D%5Bposition%5D=128.3657142857143&markers%5B0%5D%5BmarkerPosition%5D=7&markers%5B1%5D%5Bposition%5D=235.1944023323615&markers%5B1%5D%5BmarkerPosition%5D=19&markers%5B2%5D%5Bposition%5D=42.5978231292517&markers%5B2%5D%5BmarkerPosition%5D=-3
Meine Webservice-Funktion, die aufgerufen wird, lautet:
[WebMethod]
public string CreateMarkers(string markerArray)
{
return "received markers";
}
Sie erwähnten die Verwendung von json2.js, um Ihre Daten zu stringifizieren, aber die POSTed Daten scheint URLEncoded JSON Sie können es bereits gesehen haben, aber dieser Beitrag über die ungültige JSON primitive deckt, warum die JSON wird URLEncoded.
Ich würde davon abraten, einen rohen, manuell serialisierten JSON-String in Ihre Methode zu übergeben. ASP.NET wird die POST-Daten der Anfrage automatisch JSON-deserialisieren. Wenn Sie also eine JSON-Zeichenfolge manuell serialisieren und an ASP.NET senden, müssen Sie Ihre JSON-serialisierte Zeichenfolge am Ende tatsächlich JSON-serialisieren.
Ich würde eher etwas in diese Richtung 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 Problems der ungültigen JSON-Primitive ist es, jQuery einen JSON-String für den Parameter "data" zu übergeben, kein JavaScript-Objekt, so dass jQuery nicht versucht, Ihre Daten URLEncode.
Auf der Serverseite sollten Sie die Eingabeparameter Ihrer Methode an die Form der Daten anpassen, die Sie übergeben:
public class Marker
{
public decimal position { get; set; }
public int markerPosition { get; set; }
}
[WebMethod]
public string CreateMarkers(List<Marker> Markers)
{
return "Received " + Markers.Count + " markers.";
}
Sie können auch ein Array akzeptieren, z.B. Marker[] Markers
, wenn Sie dies bevorzugen. Der Deserialisierer, den ASMX ScriptServices verwendet (JavaScriptSerializer), ist ziemlich flexibel und wird alles tun, um Ihre Eingabedaten in den von Ihnen angegebenen serverseitigen Typ zu konvertieren.
data:
:
Daten, die an den Server gesendet werden. Sie werden in eine Abfragezeichenkette umgewandelt, wenn sie nicht bereits eine Zeichenkette sind.Wenn Sie die Daten als JSON senden wollen, müssen Sie sie zuerst kodieren:
data: {markers: JSON.stringify(markers)}
jQuery wandelt Objekte oder Arrays nicht automatisch in JSON um.
Aber ich nehme an, dass die Fehlermeldung von der Interpretation der Antwort des Dienstes kommt. Der Text, den Sie zurücksenden, ist nicht JSON. JSON-Strings müssen in doppelte Anführungszeichen gesetzt werden. Also müssten Sie das tun:
return "\"received markers\"";
Ich bin mir nicht sicher, ob Ihr eigentliches Problem das Senden oder Empfangen der Daten ist.
Ich bin auch auf dieses Problem gestoßen, und das ist meine Lösung.
Wenn Sie beim Parsen von Daten auf eine ungültige JSON-Objekt-Ausnahme stoßen, obwohl Sie wissen, dass Ihr JSON-String korrekt ist, stringifizieren Sie die Daten, die Sie in Ihrem Ajax-Code erhalten haben, bevor Sie sie in JSON parsen:
$.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 ...