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";
}
Riešenie

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 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.

Komentáre (13)
  1. markers nie je JSON objekt. Je to normálny objekt JavaScriptu.
  2. Prečítajte si o možnosti 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.

Komentáre (9)

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 ...
Komentáre (0)