Jquery Ajax Publicación json para webservice

Estoy tratando de publicar un objeto JSON en un servicio web asp.net.

Mi json se ve así:

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

Estoy usando json2.js para fibrilar mi objeto json.

y estoy usando jquery para publicarlo en mi servicio web.

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

Estoy teniendo el siguiente error:

“Primitiva JSON inválida:

He encontrado un montón de publicaciones relacionadas con esto y parece ser un problema muy común, pero nada de lo que bash soluciona el problema.

Cuando firebug lo que se está publicando en el servidor se ve así:

marcadores% 5B0% 5D% 5Bposition% 5D = 128.3657142857143 & marcadores% 5B0% 5D% 5BmarkerPosition% 5D = 7 & marcadores% 5B1% 5D% 5Bposition% 5D = 235.1944023323615 & marcadores% 5B1% 5D% 5BmarkerPosition% 5D = 19 & marcadores% 5B2% 5D% 5Bposition% 5D = 42.5978231292517 y marcadores% 5B2% 5D% 5BmarkerPosition% 5D = -3

Mi función de servicio web a la que se llama es:

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

Usted mencionó usar json2.js para codificar sus datos, pero los datos POSTed parecen estar URLEncoded JSON. Puede que ya lo haya visto, pero esta publicación acerca de la primitiva JSON no válida explica por qué el JSON está siendo URLEncoded.

Aconsejo no pasar una cadena JSON en bruto, manualmente serializada en su método . ASP.NET va a deserializar automáticamente los datos POST de la solicitud, de modo que si está serializando manualmente y enviando una cadena JSON a ASP.NET, terminará teniendo que serializar JSON su cadena serializada JSON.

Sugeriría algo más en esta línea:

 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 clave para evitar el problema de la primitiva JSON no válida es pasarle a jQuery una cadena JSON para el parámetro de data , no un objeto JavaScript, de modo que jQuery no intente codificar URLEn sus datos.

En el lado del servidor, haga coincidir los parámetros de entrada de su método con la forma de los datos que está pasando:

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

También puede aceptar una matriz, como Marker[] Markers , si lo prefiere. El deserializador que utiliza ASMX ScriptServices (JavaScriptSerializer) es bastante flexible y hará todo lo posible para convertir los datos de entrada en el tipo de servidor que especifique.

  1. markers no es un objeto JSON. Es un objeto JavaScript normal.
  2. Leer sobre los data: opción :

    Datos que se enviarán al servidor. Se convierte a una cadena de consulta , si no ya una cadena.

Si desea enviar los datos como JSON, primero debe codificarlos:

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

jQuery no convierte objetos o matrices a JSON automáticamente.


Pero supongo que el mensaje de error proviene de la interpretación de la respuesta del servicio. El texto que envía de vuelta no es JSON. Las cadenas JSON tienen que estar entre comillas dobles. Entonces tendrías que hacer:

 return "\"received markers\""; 

No estoy seguro de si su problema real es enviar o recibir los datos.

Me he encontrado con este también y esta es mi solución.

Si encuentra una excepción de objeto json no válida al analizar datos, aunque sepa que su cadena json es correcta, codifique los datos que recibió en su código ajax antes de analizarlos en 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 ... 

Intenté la solución de Dave Ward. La parte de datos no se enviaba desde el navegador en la parte de la carga útil de la solicitud de publicación ya que contentType está establecido en "application/json" . Una vez que eliminé esta línea, todo funcionó de maravilla.

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

Tengo una consulta,

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

Estoy publicando los detalles de inicio de sesión en json y obteniendo una cadena como "Success" , pero no recibo la respuesta.

Por favor, siga esto para ajax llame al servicio web de 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); } });