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 json2.js, um mein json-Objekt zu stringyfy.
und ich benutze jquery, um es auf meinem Webservice zu posten.
$.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 die folgende Fehlermeldung:
"Ungültiges JSON-Grundelement:
Ich habe eine Reihe von Posts gefunden, die sich darauf beziehen, und es scheint ein wirklich häufiges Problem zu sein, aber nichts, was ich versuche, behebt das Problem.
Wenn Firebug, was auf dem Server gepostet wird, sieht es so aus:
Marker% 5B0% 5D% 5Bosition% 5D = 128.3657142857143 & Marker% 5B0% 5D% 5BmarkerPosition% 5D = 7 & Marker% 5B1% 5D% 5Bposition% 5D = 235.1944023323615 & Marker% 5B1% 5D% 5BmarkerPosition% 5D2 19% 5D = 42,5978231292517 & Marker% 5B2% 5D% 5BmarkerPosition% 5D = -3
Meine aufgerufene Webservice-Funktion lautet:
[WebMethod]
public string CreateMarkers(string markerArray)
{
return "received markers";
}
quelle
Antworten:
Sie haben erwähnt, dass Sie json2.js verwenden, um Ihre Daten zu stringifizieren, aber die POST-Daten scheinen URLEncoded JSON zu sein. Sie haben es möglicherweise bereits gesehen, aber dieser Beitrag über das ungültige JSON- Grundelement behandelt, warum JSON URLEncoded ist.
Ich würde raten , gegen Übergabe eines rohen, manuell serialisiert JSON - String in Ihre Methode . ASP.NET wird die POST-Daten der Anforderung automatisch von JSON deserialisieren. Wenn Sie also eine JSON-Zeichenfolge manuell serialisieren und an ASP.NET senden, müssen Sie Ihre JSON-serialisierte Zeichenfolge tatsächlich JSON-serialisieren.
Ich würde etwas mehr in diese Richtung vorschlagen:
Der Schlüssel zur Vermeidung des ungültigen primitiven JSON-Problems besteht darin, jQuery eine JSON-Zeichenfolge für das zu übergeben
data
Parameter und kein JavaScript-Objekt zu übergeben, damit jQuery nicht versucht, Ihre Daten mit URLEncode zu versehen.Passen Sie auf der Serverseite die Eingabeparameter Ihrer Methode an die Form der Daten an, die Sie übergeben:
Sie können auch ein Array akzeptieren
Marker[] Markers
, wenn Sie dies bevorzugen. Der von ASMX ScriptServices verwendete Deserializer (JavaScriptSerializer) ist ziemlich flexibel und unternimmt alles, um Ihre Eingabedaten in den von Ihnen angegebenen serverseitigen Typ zu konvertieren.quelle
contentType
berücksichtigt, wenn wir GET und nicht POST verwenden?markers
ist kein JSON-Objekt. Es ist ein normales JavaScript-Objekt.data:
Option :Wenn Sie die Daten als JSON senden möchten, müssen Sie sie zuerst codieren:
jQuery konvertiert Objekte oder Arrays nicht automatisch in JSON.
Ich gehe jedoch davon aus, dass die Fehlermeldung von der Interpretation der Antwort des Dienstes stammt. Der Text, den Sie zurücksenden, ist nicht JSON. JSON-Zeichenfolgen müssen in doppelte Anführungszeichen gesetzt werden. Sie müssten also Folgendes tun:
Ich bin nicht sicher, ob Ihr eigentliches Problem das Senden oder Empfangen der Daten ist.
quelle
markers
als JSON-Zeichenfolge senden ?Ich habe Dave Wards Lösung ausprobiert. Der Datenteil wurde im Nutzdatenbereich der Post-Anfrage nicht vom Browser gesendet, da der Inhaltstyp auf eingestellt ist
"application/json"
. Nachdem ich diese Zeile entfernt hatte, funktionierte alles hervorragend.quelle
Ich bin auch diesem begegnet und dies ist meine Lösung.
Wenn beim Parsen von Daten eine ungültige JSON-Objektausnahme auftritt, obwohl Sie wissen, dass Ihre JSON-Zeichenfolge korrekt ist, stringifizieren Sie die Daten, die Sie in Ihrem Ajax-Code erhalten haben, bevor Sie sie in JSON analysieren:
quelle
Ich habe Anfrage,
Ich poste die Anmeldedaten in json und erhalte eine Zeichenfolge als
"Success"
, aber ich erhalte keine Antwort.quelle
Bitte folgen Sie diesem Befehl durch einen Ajax-Aufruf des Webservices von Java var param = {feildName: feildValue}; JSON.stringify ({data: param})
quelle