Jquery Ajax Publisering av json til webtjeneste

Jeg prøver å sende et JSON-objekt til en asp.net-nettjeneste.

Min json ser slik ut:

var markers = { "markers": [
  { "position": "128.3657142857143", "markerPosition": "7" },
  { "position": "235.1944023323615", "markerPosition": "19" },
  { "position": "42.5978231292517", "markerPosition": "-3" }
]};

Jeg bruker json2.js til å stringyfy json-objektet mitt.

og jeg bruker jquery til å legge det ut på webtjenesten min.

  $.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);
        }
  });

Jeg får følgende feil:

"Ugyldig JSON-primitive:

Jeg har funnet en haug med innlegg relatert til dette, og det ser ut til å være et veldig vanlig problem, men ingenting jeg prøver løser problemet.

Når firebug hva som blir lagt ut på serveren, ser det slik ut:

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

Min webservice-funksjon som blir kalt er:

[WebMethod]
public string CreateMarkers(string markerArray)
{
    return "received markers";
}
Løsning

Du nevnte å bruke json2.js for å stringify dataene dine, men de sendte dataene ser ut til å være URLEncoded JSON Du har kanskje allerede sett det, men dette innlegget om den ugyldige JSON-primitive dekker hvorfor JSON blir URLEncoded.

Jeg [fraråder] å sende en rå, manuelt serialisert JSON-streng til metoden din]2. ASP.NET kommer til å automatisk JSON deserialize forespørselens POST-data, så hvis du manuelt serialiserer og sender en JSON-streng til ASP.NET, vil du faktisk ende opp med å JSON-serialisere din JSON-serialiserte streng.

Jeg vil foreslå noe mer langs disse linjene:

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);
    }
});

Nøkkelen til å unngå det ugyldige JSON-primitive problemet er å sende jQuery en JSON-streng for parameteren data, ikke et JavaScript-objekt, slik at jQuery ikke prøver å URLEncode dataene dine.

På serversiden må du matche metodens inngangsparametere til formen på dataene du sender inn:

public class Marker
{
  public decimal position { get; set; }
  public int markerPosition { get; set; }
}

[WebMethod]
public string CreateMarkers(List Markers)
{
  return "Received " + Markers.Count + " markers.";
}

Du kan også godta en matrise, som Marker[] Markører, hvis du foretrekker det. Deserializeren som ASMX ScriptServices bruker (JavaScriptSerializer) er ganske fleksibel, og vil gjøre det den kan for å konvertere inndataene dine til server-side-typen du spesifiserer.

Kommentarer (13)
  1. markers er ikke et JSON-objekt. Det er et vanlig JavaScript-objekt.
  2. Les om data:-alternativet: Data som skal sendes til serveren. Den konverteres til en forespørselsstreng, hvis den ikke allerede er en streng.

Hvis du vil sende dataene som JSON, må du kode dem først:

data: {markers: JSON.stringify(markers)}

jQuery konverterer ikke objekter eller matriser til JSON automatisk.


Men jeg antar at feilmeldingen kommer fra å tolke svaret fra tjenesten. Teksten du sender tilbake er ikke JSON. JSON-strenger må omsluttes av doble anførselstegn. Så det må du gjøre:

return "\"received markers\"";

Jeg er ikke sikker på om det faktiske problemet ditt er å sende eller motta dataene.

Kommentarer (9)

Jeg har også støtt på dette, og dette er min løsning.

Hvis du støter på et ugyldig json-objekt unntak når du analyserer data, selv om du vet at json-strengen din er riktig, må du stringify dataene du mottok i ajax-koden din før du analyserer dem til 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 ...
Kommentarer (0)