Jquery Ajax Postarea json pentru a webservice

Am încercat să postez un obiect JSON de la un asp.net webservice.

Mi json pare ca acest lucru:

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

Eu sunt, folosind json2.js pentru a stringyfy meu obiect json.

și eu sunt, folosind jquery pentru a-l posta pentru a-mi webservice.

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

Primesc urmatoarea eroare:

"Invalid JSON primitive:

Am găsit o grămadă de posturi referitoare la acest lucru și se pare a fi o problemă comună, dar nimic nu încerc rezolvă problema.

Când firebug ceea ce este postat pe server, se pare ca acest lucru:

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

Mi webservice funcției pe care este chemată este:

[WebMethod]
public string CreateMarkers(string markerArray)
{
    return "received markers";
}
Comentarii la întrebare (1)
Soluția
  • Ați menționat, folosind json2.js pentru a stringify datele, dar Postat de date pare a fi URLEncoded JSON poate că Ați văzut-o deja, dar acest post despre invalid JSON primitive se referă la ce JSON este URLEncoded.

Am'd recomanda impotriva trecerea unei prime, manual-serializat șir JSON în metoda. ASP.NET va automat JSON deserialize cererea's POST date, așa că, dacă ai're manual serializarea și trimiterea unui șir JSON pentru a ASP.NET ai'll de fapt ajung să JSON serialize ta JSON serializat șir.

Am'd sugera ceva mai mult de-a lungul acestor linii:

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

Cheia pentru a evita invalid JSON primitive problema este de a trece un șir JSON jQuery pentru "date" parametru, nu un obiect JavaScript, astfel încât jQuery nu't încercare de a URLEncode datele.

Pe partea de server, meci metoda ta's parametrii de intrare la forma de datele pe care le're trece în:

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

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

De asemenea, puteți accepta o matrice, ca Marker[] Markeri`, dacă preferați. La deserializer care ASMX ScriptServices utilizări (JavaScriptSerializer) este destul de flexibil, și va face tot ce poate pentru a converti datele de intrare în server-side de tip specificat.

Comentarii (13)
  1. ` "indicatorii" nu este un obiect JSON. Este normal obiect JavaScript.
  2. Citeste despre data: opțiune:

    Datele să fie trimise la server. Acesta este convertit la un șir de interogare, dacă nu este deja un șir de caractere.

Dacă doriți să trimiteți date JSON, trebuie să se codifica primul:

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

jQuery nu se transforma în obiecte sau tablouri de la JSON în mod automat.


Dar presupun mesajul de eroare vine de la interpretarea de răspuns a serviciului. Textul pe care îl trimite înapoi nu este JSON. JSON siruri de caractere trebuie să fie închise în ghilimele. Deci'd trebuie sa faci:

return "\"received markers\"";

Am'm nu sunt sigur daca problema este de a trimite sau a primi date.

Comentarii (9)

Am încercat Dave Ward's soluție. Partea de date nu a fost trimis la browser-ul în încărcătura parte din cerere post ca contentType este setat la "application/json". Odată ce am eliminat această linie, totul a mers minunat.

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);
    }
});
Comentarii (0)

Am întâlnit asta și aceasta este soluția mea.

Dacă ai întâlni un invalid obiect json excepție atunci când parsarea datelor, chiar dacă știi că json string este corectă, stringify datele pe care le-a primit în ajax cod înainte de parsare pentru 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 ...
Comentarii (0)

Am interogare,

$("#login-button").click(function(e){ alert("hiii");

        var username = $("#username-field").val();
        var password = $("#username-field").val();

        alert(username);
        alert("password" + password);

        var markers = { "userName" : "admin","password" : "admin123"};
        $.ajax({
            type: "POST",
            url: url,
            // The key needs to match your method's input parameter (case-sensitive).
            data: JSON.stringify(markers),
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function(data){alert("got the data"+data);},
            failure: function(errMsg) {
                alert(errMsg);
            }
        });

    });

Am'm a posta detaliile de conectare în json și obținerea unui șir ca `"Succes", dar nu'm nu primesc răspunsul.

Comentarii (1)

Vă rugăm să urmați acest lucru prin apel ajax la webservice java var param = { feildName: feildValue }; JSON.stringify({date : param})

$.ajax({
            dataType    : 'json',
            type        : 'POST',
            contentType : 'application/json',
            url         : '/rest/priceGroups',
            data        : JSON.stringify({data : param}),
            success     : function(res) {
                if(res.success == true){
                    $('#alertMessage').html('Successfully price group created.').addClass('alert alert-success fade in');
                    $('#alertMessage').removeClass('alert-danger alert-info');
                    initPriceGroupsList();
                    priceGroupId = 0;
                    resetForm();                                                                    
                }else{                          
                    $('#alertMessage').html(res.message).addClass('alert alert-danger fade in');
                }
                $('#alertMessage').alert();         
                window.setTimeout(function() { 
                    $('#alertMessage').removeClass('in');
                    document.getElementById('message').style.display = 'none';
                }, 5000);
            }
        });
Comentarii (1)