Jquery Ajax JSON posten naar webservice

Ik probeer een JSON-object naar een asp.net-webservice te posten.

Mijn json ziet er zo uit:

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

Ik gebruik de json2.js om mijn JSON-object te stringyfy.

en ik gebruik jQuery om het op mijn webservice te plaatsen.

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

Ik krijg de volgende foutmelding:

Ongeldige JSON-primitief

Ik heb een aantal berichten hierover gevonden en het lijkt een veel voorkomend probleem te zijn, maar niets wat ik probeer lost het probleem op.

Als firebug wat op de server wordt gepost, ziet het er als volgt uit:

markeringen%5B0%5D%5Bposition%5D=128.3657142857143&markers%5B0%5D%5BmarkerPosition%5D=7&markers%5B1%5D%5Bposition%5D=235.1944023323615&markers%5B1%5D%5Bmarker =19&markers%5B2%5D%5Bposition%5D=42.5978231292517&markers%5B2%5D%5BmarkerPosition%5D=-3

Mijn webservicefunctie die wordt aangeroepen is:

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

Antwoord 1, autoriteit 100%

Je noemde het gebruik van json2.js om je gegevens te stringen, maar de POST-gegevens lijken URLEncoded JSON te zijn. Je hebt het misschien al gezien, maar dit bericht over de ongeldige JSON-primitivelegt uit waarom de JSON URLEncoded wordt.

Ik zou adviseren tegeneen onbewerkte, handmatig geserialiseerde JSON-tekenreeks doorgeven aan uw methode. ASP.NET gaat automatisch JSON deserialiseren van de POST-gegevens van het verzoek, dus als je handmatig serialiseert en een JSON-string naar ASP.NET stuurt, zul je uiteindelijk je JSON-serialized string moeten serialiseren.

Ik zou iets meer in deze richting willen voorstellen:

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);},
    error: function(errMsg) {
        alert(errMsg);
    }
});

De sleutel tot het vermijden van het ongeldige JSON-primitieve probleem is om jQuery een JSON-tekenreeks voor de parameter datadoor te geven, niet een JavaScript-object, zodat jQuery niet probeert uw gegevens te URLEncoderen.

p>

Aan de serverzijde, stem de invoerparameters van uw methode af op de vorm van de gegevens die u doorgeeft:

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.";
}

Je kunt desgewenst ook een array accepteren, zoals Marker[] Markers. De deserializer die ASMX ScriptServices gebruikt (JavaScriptSerializer) is behoorlijk flexibel en zal er alles aan doen om uw invoergegevens om te zetten in het server-side type dat u opgeeft.


Antwoord 2, autoriteit 5%

  1. markersis geen JSON-object. Het is een normaal JavaScript-object.
  2. Lees over de data:optie:

    Gegevens die naar de server moeten worden verzonden. Het wordt geconverteerd naar een query-tekenreeks, zo niet al een tekenreeks.

Als u de gegevens als JSON wilt verzenden, moet u deze eerst coderen:

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

jQuery converteert objecten of arrays niet automatisch naar JSON.


Maar ik neem aan dat de foutmelding afkomstig is van het interpreteren van de reactie van de service. De tekst die u terugstuurt, is geen JSON. JSON-tekenreeksen moeten tussen dubbele aanhalingstekens staan. Je zou dus het volgende moeten doen:

return "\"received markers\"";

Ik weet niet zeker of uw werkelijke probleem het verzenden of ontvangen van de gegevens is.


Antwoord 3

Ik heb de oplossing van Dave Ward geprobeerd. Het gegevensgedeelte werd niet verzonden vanuit de browser in het payload-gedeelte van het postverzoek omdat het contentTypeis ingesteld op "application/json". Nadat ik deze regel had verwijderd, werkte alles prima.

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);},
    error: function(errMsg) {
        alert(errMsg);
    }
});

Antwoord 4

Ik ben deze ook tegengekomen en dit is mijn oplossing.

Als u een ongeldige json-objectuitzondering tegenkomt bij het ontleden van gegevens, hoewel u weet dat uw json-tekenreeks correct is, moet u de gegevens die u in uw ajax-code hebt ontvangen, strenger maken voordat u deze naar JSON parseert:

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

Antwoord 5

Volg dit a.u.b. door ajax te bellen naar de webservice van java
var param = {
veldnaam: veldwaarde
};
JSON.stringify({data: param})

$.ajax({
            dataType    : 'json',
            type        : 'POST',
            contentType : 'application/json',
            url         : '<%=request.getContextPath()%>/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);
            }
        });

Other episodes