Jquery Ajax Pubblicazione json su webservice

Sto provando a pubblicare un object JSON su un webservice asp.net.

Il mio json ha questo aspetto:

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

Sto usando json2.js per filtrare il mio object json.

e sto usando jquery per postarlo sul mio 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); } }); 

Sto ottenendo il seguente errore:

“Primitivo JSON non valido:

Ho trovato un sacco di post relativi a questo e sembra essere un problema molto comune, ma niente di quello che cerco risolve il problema.

Quando firebug viene pubblicato sul server, appare come questo:

marcatori% 5B0% 5D% 5Bposition% 5D = 128,3657142857143 & marcatori% 5B0% 5D% 5BmarkerPosition% 5D = 7 & marcatori% 5B1% 5D% 5Bposition% 5D = 235,1944023323615 & marcatori% 5B1% 5D% 5BmarkerPosition% 5D = 19 e marcatori% 5B2% 5D% 5Bposition% 5D = 42,5978231292517 & marcatori% 5B2% 5D% 5BmarkerPosition% 5D = -3

La mia funzione di webservice chiamata è:

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

Hai menzionato l’utilizzo di json2.js per l’analisi dei dati, ma i dati POSTed sembrano essere JSON URLEncoded Potresti averlo già visto, ma questo post sulla primitiva JSON non valida copre il motivo per cui JSON viene codificato con URL.

Vi sconsigliamo di passare una stringa JSON raw serializzata manualmente nel vostro metodo . ASP.NET disabiliterà automaticamente la deserializzazione dei dati POST della richiesta, quindi se esegui manualmente la serializzazione e l’invio di una stringa JSON su ASP.NET, in realtà finirai per dover serializzare JSON sulla stringa serializzata JSON.

Suggerirei qualcosa di più seguendo queste linee:

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

La chiave per evitare il problema primitivo JSON non valido è passare jQuery una stringa JSON per il parametro data , non un object JavaScript, in modo che jQuery non tenti di URLEncode i dati.

Sul lato server, abbina i parametri di input del tuo metodo alla forma dei dati che stai trasmettendo:

 public class Marker { public decimal position { get; set; } public int markerPosition { get; set; } } [WebMethod] public string CreateMarkers(List Markers) { return "Received " + Markers.Count + " markers."; } 

Puoi anche accettare un array, come Marker[] Markers , se preferisci. Il deserializzatore utilizzato da ASMX ScriptServices (JavaScriptSerializer) è piuttosto flessibile e farà tutto il ansible per convertire i dati di input nel tipo di server specificato.

  1. markers non sono oggetti JSON. È un normale object JavaScript.
  2. Leggi i data: opzione :

    Dati da inviare al server. Viene convertito in una stringa di query , se non già una stringa.

Se vuoi inviare i dati come JSON, devi prima codificarli:

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

jQuery non converte automaticamente oggetti o array in JSON.


Ma presumo che il messaggio di errore provenga dall’interpretazione della risposta del servizio. Il testo che rispedisci non è JSON. Le stringhe JSON devono essere racchiuse tra virgolette. Quindi dovresti fare:

 return "\"received markers\""; 

Non sono sicuro che il tuo problema sia l’invio o la ricezione dei dati.

Ho incontrato anche questo e questa è la mia soluzione.

Se durante l’analisi dei dati si verifica un’eccezione dell’object json non valida, anche se si è certi che la stringa JSON è corretta, stringificare i dati ricevuti nel codice ajax prima di analizzarli su 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 ... 

Ho provato la soluzione di Dave Ward. La parte dei dati non è stata inviata dal browser nella parte del carico utile della richiesta di post poiché contentType è impostato su "application/json" . Una volta rimossa questa linea, tutto ha funzionato alla grande.

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

Ho una domanda,

 $("#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); } }); }); 

Sto postando i dettagli di accesso in json e ottenendo una stringa come "Success" , ma non ricevo la risposta.

Si prega di seguire questo con una chiamata ajax al webservice di java var param = {feildName: feildValue}; 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); } });