Jquery Ajax Vysielanie json do webovej služby
Snažím sa odoslať objekt JSON do webovej služby asp.net.
Môj JSON vyzerá takto:
var markers = { "markers": [
{ "position": "128.3657142857143", "markerPosition": "7" },
{ "position": "235.1944023323615", "markerPosition": "19" },
{ "position": "42.5978231292517", "markerPosition": "-3" }
]};
Používam json2.js na stringyfy môjho objektu json.
a používam jquery na jeho odoslanie do mojej webovej služby.
$.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);
}
});
Dostávam nasledujúcu chybu:
"Invalid JSON primitive:
Našiel som množstvo príspevkov týkajúcich sa tohto problému a zdá sa, že je to naozaj častý problém, ale nič z toho, čo som skúsil, tento problém nevyriešilo.
Keď firebug čo sa odosiela na server, vyzerá to takto:
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
Moja funkcia webovej služby, ktorá sa volá, je:
[WebMethod]
public string CreateMarkers(string markerArray)
{
return "received markers";
}
Spomenuli ste, že na reťazcovú úpravu údajov používate json2.js, ale odoslané údaje sa zdajú byť URLEncoded JSON Možno ste to už videli, ale tento príspevok o neplatnom primitíve JSON sa zaoberá tým, prečo je JSON URLEncoded.
Ja by som neodporúčal* odovzdávať do vašej metódy surový, ručne serializovaný reťazec JSON. ASP.NET bude automaticky deserializovať údaje POST požiadavky'a, takže ak manuálne serializujete a posielate reťazec JSON do ASP.NET, v skutočnosti nakoniec budete musieť serializovať svoj reťazec JSON.
Navrhoval by som niečo viac v tomto duchu:
Kľúčom k vyhnutiu sa problému s neplatným primitívom JSON je odovzdať jQuery reťazec JSON pre parameter
data
, nie objekt JavaScript, aby sa jQuery nepokúšalo URLEncode vaše údaje.Na strane servera prispôsobte vstupné parametre svojej metódy tvaru údajov, ktoré odovzdávate:
Ak chcete, môžete prijať aj pole, napríklad
Marker[] Markers
. Deserializátor, ktorý používa ASMX ScriptServices (JavaScriptSerializer), je dosť flexibilný a urobí, čo môže, aby previedol vaše vstupné údaje na typ na strane servera, ktorý ste zadali.markers
nie je JSON objekt. Je to normálny objekt JavaScriptu.data:
:Ak chcete údaje odoslať ako JSON, musíte ich najprv zakódovať:
Aplikácia jQuery nekonvertuje objekty alebo polia na JSON automaticky.
Predpokladám však, že chybová správa pochádza z interpretácie odpovede služby. Text, ktorý posielate späť, nie je JSON. Reťazce JSON musia byť uzavreté v dvojitých úvodzovkách. Takže by ste museli urobiť:
Nie'som si istý, či je váš skutočný problém v odosielaní alebo prijímaní údajov.
S týmto problémom som sa stretol aj ja a toto je moje riešenie.
Ak sa pri parsovaní údajov stretávate s výnimkou neplatného objektu json, hoci viete, že reťazec json je správny, reťazcujte prijaté údaje v kóde ajaxu pred ich parsovaním do JSON: