Jquery Ajax Envío de json a webservice

Estoy intentando enviar un objeto JSON a un webservice 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 el json2.js para encadenar mi objeto json.

y estoy usando jquery para enviarlo a 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 recibiendo el siguiente error:

"Primitiva JSON inválida:

He encontrado un montón de posts relacionados con esto y parece ser un problema muy común, pero nada de lo que intento arregla el problema.

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

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

La función de mi webservice que se llama es:

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

Usted mencionó el uso de json2.js para encadenar sus datos, pero los datos POSTed parece ser URLEncoded JSON Usted puede haber visto ya, pero este post sobre la primitiva JSON no válida cubre por qué el JSON está siendo URLEncoded.

Yo aconsejo no pasar una cadena JSON cruda y serializada manualmente a su método. ASP.NET va a deserializar automáticamente los datos POST de la petición, así que si usted serializa manualmente y envía una cadena JSON a ASP.NET, acabará teniendo que serializar su cadena JSON.

Yo sugeriría algo más parecido a esto:

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 inválida es pasar a jQuery una cadena JSON para el parámetro data, no un objeto JavaScript, para que jQuery no intente URLEncode 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 un array, como Marker[] Markers, si lo prefiere. El deserializador que utiliza ASMX ScriptServices (JavaScriptSerializer) es bastante flexible, y hará lo que pueda para convertir tus datos de entrada en el tipo del lado del servidor que especifiques.

Comentarios (13)
  1. markers no es un objeto JSON. Es un objeto JavaScript normal.
  2. Lea sobre la opción data:: Datos que se enviarán al servidor. Se convierte en una cadena de consulta, si no es ya una cadena.

Si quieres enviar los datos como JSON, tienes que codificarlos primero:

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

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


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

return "\"received markers\"";

No estoy seguro de si tu problema real es el envío o la recepción de los datos.

Comentarios (9)

Yo también me he encontrado con esto y esta es mi solución.

Si te encuentras con una excepción de objeto json inválido al analizar los datos, aunque sepas que tu cadena json es correcta, encadena los datos que has recibido en tu 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 ...
Comentarios (0)