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:
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);
}
});
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:
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.";
}
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:
:Údaje, ktoré sa majú odoslať na server. Ak už nie je reťazec, prevedie sa na dotazový reťazec.
Ak chcete údaje odoslať ako JSON, musíte ich najprv zakódovať:
data: {markers: JSON.stringify(markers)}
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ť:
return "\"received markers\"";
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:
$.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 ...